
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
01.12.2016, 09:35
|
|||
|---|---|---|---|
|
|||
EXISTS и FULL SCAN |
|||
|
#18+
Доброго времени суток! Необходимо создать отчет по клиентам, у которых есть начисления за один период и нет за другой. Оптимизировал, но уперся в FULL SCAN. Хинт по индексу index(b BILL_CLNTBLTP_I) оптимизатор не видит. Если хинт поставить в начало, план получается вообще ужасный. Подскажите пожалуйста, как его побороть? client_histories - 20 497 667 строк bills - 160 939 855 строк Запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. План запроса на картинке во вложении. С этим планом запроса время выполнения 2.5 минуты. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2016, 10:08
|
|||
|---|---|---|---|
|
|||
EXISTS и FULL SCAN |
|||
|
#18+
1. может NOT exists? 2. может в exists все-таки надо смотреть b1.summa_all_$ > 0, но чтобы таких записей не было (т.е. нет оплаты в период) или действительно надо смотреть, что за прошлый период оплата есть, но с 0 суммой? 3. если вдруг в каждый момент с клиентом есть только один договор, то client_histories из exists можно бы убрать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2016, 10:16
|
|||
|---|---|---|---|
|
|||
EXISTS и FULL SCAN |
|||
|
#18+
Имхо хорошо бы привязку делать по id договора, а не по id клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2016, 10:36
|
|||
|---|---|---|---|
EXISTS и FULL SCAN |
|||
|
#18+
Миша78, Код: plsql 1. ORDERED не допускает указание query_block или чего-то еще. Пусть будет, если это действительно надо Код: plsql 1. Что ожидается от сначала parallel по bills-ам, а потом index по bills-ам, не знаю. ПС вроде угрожал bills-партиционировать много лет назад, но тут по плану таблички не партиционированы, а судя по названию, это индекс на BILLS(CLNT_CLNT_ID, + что-то еще). Таким образом, либо parallel(b 8), либо use_nl(b) index(b), вместе бессмысленно. BILLS, наверное, по BILL_DATE бы партиционировали помесячно, так что в parallel index range scan по партициям тут особо смысла не имеет, даже если бы она была партиционирована. Зачем делать ведущей табличкой открытых клиентов с прямым договором, тоже не знаю, т.к. я так понимаю, прямых договоров и открытых клиентов "много". Если много закрытых клиентов, то можно посмотреть в сторону настройки процессов архивации, избавляющие от этого добра, если это основная биллинговая БД, а не отчетная. Если отчетная, то партиционировать по BILL_DATE, это должен быть популярный фильтр для отчетности. Вообще, если это весь запрос, я бы посмотрел альтернативу и избавился бы от второго обращения к BILLS/CH. Что-нибудь вроде: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 2 записи в BILLS на клиента не должно быть, как я помню, и отрицательных summa_all_$ не будет, иначе надо подредактировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2016, 12:55
|
|||
|---|---|---|---|
EXISTS и FULL SCAN |
|||
|
#18+
Миша78, А есть вообще индекс на bill_date ? Он должен использоваться в плане. Партиционирование bill_date уже сказали. Матвью на EXISTS тоже можно придумать. Seagate - переписывание в один запрос может быть и дольше, зависит от количество клиент/договор (т.к. EXISTS срабатывает по первому нахождению). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.12.2016, 10:28
|
|||
|---|---|---|---|
|
|||
EXISTS и FULL SCAN |
|||
|
#18+
Спасибо боьлшое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&tablet=1&tid=1886884]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
201ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 291ms |
| total: | 588ms |

| 0 / 0 |
