Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимизация запроса  [new]
elimpion
Member

Откуда:
Сообщений: 235
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"
подскажите какие варианты есть чтобы увеличить скорость выполнения запроса?

К сообщению приложен файл. Размер - 74Kb
29 апр 19, 16:55    [21874630]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
elimpion
Member

Откуда:
Сообщений: 235
Извините не ту картинку приложил

К сообщению приложен файл. Размер - 61Kb
29 апр 19, 16:56    [21874632]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
elimpion
подскажите какие варианты есть чтобы увеличить скорость выполнения запроса?

Обычные.
- изучить модель данных, объемы
- изучить логику запроса
- разобрать детально план(ы) исполнения
- определить операции, пожирающие время и ресурсы
- на основании собранных данных принять решение о привлечении специалиста
29 апр 19, 17:21    [21874663]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
У вас 3 обращения к таблице CLCOMPATTRS, точно можно обойтись 2-мя и можно in на EXISTS переписать и сравнить планы выполнения
30 апр 19, 07:09    [21875111]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MazoHist
Member

Откуда:
Сообщений: 145
elimpion,
таблица партиционирована? какие индексы на таблице? В общем случае без фильтра по клиенту этот запрос быстро работать не будет - в EAV столбец "атрибут" неселективен и индексировать его отдельно не имеет смысла.
alex-ls
У вас 3 обращения к таблице CLCOMPATTRS, точно можно обойтись 2-мя и можно in на EXISTS переписать и сравнить планы выполнения

Можно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).
30 апр 19, 08:13    [21875151]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MazoHist
Member

Откуда:
Сообщений: 145
MazoHist
Можно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).

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
30 апр 19, 08:20    [21875155]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MazoHist
Member

Откуда:
Сообщений: 145
Ошибся. вместо OR надо указать AND
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
30 апр 19, 08:23    [21875157]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
MazoHist
MazoHist
Можно и за один и это единственный вариант помочь этому запросу не создавая индексов (получить все за один table access full).

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


строго говоря, запрос не эквивалентен изначальному, так как в нем требуется соблюдение одновременно двух условий, а у вас будет достаточно одного.
30 апр 19, 08:25    [21875160]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
MazoHist
Ошибся. вместо OR надо указать AND
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


а этот вообще с кривыми алиасами. а если их поправить, он ничего не вернёт
30 апр 19, 08:26    [21875161]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MazoHist
Member

Откуда:
Сообщений: 145
Посетитель
а этот вообще с кривыми алиасами. а если их поправить, он ничего не вернёт

Согласен, алиасы скопировал и немного затупил.
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
30 апр 19, 08:53    [21875179]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Dshedoo
Member

Откуда:
Сообщений: 393
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
30 апр 19, 09:04    [21875193]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
MazoHist
Можно и за один и это единственный вариант помочь этому запросу не создавая индексов

наверное, я сильно в условия не смотрел, но на мой взгляд автор запроса должен сам хоть чуток думать, а вы как обычно разжевываете и срыгиваете ему в рот готовое решение...
30 апр 19, 10:44    [21875304]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить