powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса
12 сообщений из 12, страница 1 из 1
Оптимизация запроса
    #39807749
elimpion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clientid in (select c1.clientid 
                       from CLCOMPATTRS c1
                      where upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null)
  and c.clientid in (select c2.clientid 
                       from CLCOMPATTRS c2
                      where upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9)
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and c.clientid = 344247


Всем привет, очень долго работает запрос, если убрать "and c.clientid = 344247"
подскажите какие варианты есть чтобы увеличить скорость выполнения запроса?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39807751
elimpion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините не ту картинку приложил
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39807776
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
elimpionподскажите какие варианты есть чтобы увеличить скорость выполнения запроса?
Обычные.
- изучить модель данных, объемы
- изучить логику запроса
- разобрать детально план(ы) исполнения
- определить операции, пожирающие время и ресурсы
- на основании собранных данных принять решение о привлечении специалиста
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808087
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас 3 обращения к таблице CLCOMPATTRS, точно можно обойтись 2-мя и можно in на EXISTS переписать и сравнить планы выполнения
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808108
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
elimpion,
таблица партиционирована? какие индексы на таблице? В общем случае без фильтра по клиенту этот запрос быстро работать не будет - в EAV столбец "атрибут" неселективен и индексировать его отдельно не имеет смысла.
alex-lsУ вас 3 обращения к таблице CLCOMPATTRS, точно можно обойтись 2-мя и можно in на EXISTS переписать и сравнить планы выполнения
Можно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808110
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistМожно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).
Код: plsql
1.
2.
3.
4.
5.
6.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and ((upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null)   
           or (upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9))
  --and c.clientid = 344247
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808111
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся. вместо OR надо указать AND
Код: plsql
1.
2.
3.
4.
5.
6.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and ((upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null)   
           and (upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9))
  --and c.clientid = 344247
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808114
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistMazoHistМожно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).
Код: plsql
1.
2.
3.
4.
5.
6.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and ((upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null)   
           or (upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9))
  --and c.clientid = 344247



строго говоря, запрос не эквивалентен изначальному, так как в нем требуется соблюдение одновременно двух условий, а у вас будет достаточно одного.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808115
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistОшибся. вместо OR надо указать AND
Код: plsql
1.
2.
3.
4.
5.
6.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and ((upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null)   
           and (upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9))
  --and c.clientid = 344247



а этот вообще с кривыми алиасами. а если их поправить, он ничего не вернёт
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808126
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительа этот вообще с кривыми алиасами. а если их поправить, он ничего не вернёт
Согласен, алиасы скопировал и немного затупил.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select * from (
select с.*, count(*) over (partition by client_id) cnt from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
  and ((upper(c.clcompattrrefid) = 'ZONEPHONENUMBER' and c.clcompattrvalue is not null)   
           or (upper(c.clcompattrrefid) = 'PHONENUMBER' and length(c.clcompattrvalue) = 9))
) where cnt = 2
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808137
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * from CLCOMPATTRS c
where upper(c.clattrrefid) = 'MOBILPHONE'
  and exists (select c1.clientid 
                       from CLCOMPATTRS c1
                      where upper(c1.clcompattrrefid) = 'ZONEPHONENUMBER' and c1.clcompattrvalue is not null and c.clientid = c1.clientid )
  and exists (select c2.clientid 
                       from CLCOMPATTRS c2
                      where upper(c2.clcompattrrefid) = 'PHONENUMBER' and length(c2.clcompattrvalue) = 9 and c.clientid = c2.clientid )
  and c.clcompattrrefid in ('PHONENUMBER','ZONEPHONENUMBER')
--  and c.clientid = 344247
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39808197
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistМожно и за один и это единственный вариант помочь этому запросу не создавая индексов
наверное, я сильно в условия не смотрел, но на мой взгляд автор запроса должен сам хоть чуток думать, а вы как обычно разжевываете и срыгиваете ему в рот готовое решение...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]