|
|
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
Добрый день, эксперты! Оптимизировал следующий запрос заменив оператор OR между условиями WHERE, на подзапросы с UNION-ами. СУБД Oracle 11g, 16 ядер, 64 ГБ RAM. Количество строк в "test_sample" - 130 млн. Количество строк в "increm" - 10 тыс. Типы данных всех полей NVARCHAR2(от 20 до 300), кроме p.S3 - это NUMBER. Индексы на каждый атрибут в WHERE есть. Составные индексы не использовал. Среднее время выполнения 70-80 минут, другой нагрузки на оракл в момент выполнения запроса нет. Можно ли что то улучшить? Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:36:21 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyv, Выкидывайте все DISTINCT-ы. В In они и так не нужны, а они еще и UNION-ом дублируются. Возможно, UNION имеет смысл заменить на UNION ALL. Наборы полей в секциях WHERE всегда постоянные или варьируются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:55:14 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyv, План давай в студию) И вообщем то проверь на NL/HASH ведь если на выходе джоина у тебя не много данных, то там везде должен прослеживаться NL, к тому же есть идексы на все колонки (а проверить что они используются btw ? ) , т.к. если там хєш то можно упасть в какой нибудь не оптимальный multi-pass на твоих 130 млн. UNION и DISTINCT тоже могут быть проблемой, если в каждой операции возвращаеться достаточно большое количество строк ( 6 раз сортировать большой сет после добавления очередной порции, ну как то вообще не оптимально, верно ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 13:11:46 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyvСоставные индексы не использовал. Не заметил. Конечно они здесь нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 13:21:19 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
miksoft, набор полей всегда одинаковый. Пробую составные индексы на поля таблицы со 130 млн записей? выкинул DISTINCT-ы, действительно их UNION заменит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 15:45:49 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
ora601, прикрепил план. Правильно я понимаю, что наибольший cost дают подзапросы? Исключение distinct-ов значительно запрос не ускорило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 15:58:09 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyv, план с gather_plan_statistics покажи. Если есть bitmap, то необязательно иметь составные индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 16:36:07 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyvДобрый день, эксперты! Оптимизировал следующий запрос заменив оператор OR между условиями WHERE, на подзапросы с UNION-ами. *** Среднее время выполнения 70-80 минут, другой нагрузки на оракл в момент выполнения запроса нетмне кажется, оптимизация в результате выглядит как-то по-другому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 16:38:58 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
union -> union all равномерно ли условия отсекают данные в каждом подзапросе? если какие-то условия отсекают сразу много данных можно сначала выполнить поиск по этим индексам, потом добавить оставшиеся условия increm каждый раз fullscan, можно вынести отдельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 16:48:47 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyv, посмотрев ваш план, попробовал бы запрос переписать в такой вид: Код: 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. в общем смысл, думаю, понятен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 16:50:17 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
alexeyyv, каждый из подзапросов работает быстро? сколько строк возвращает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 17:15:29 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
Имхо 1. union all вместо union и дистинкт вынести наверх 2. во все индексы добавить s3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 17:46:02 |
|
||
|
Оптимизация условия WHERE IN
|
|||
|---|---|---|---|
|
#18+
а если так? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 19:28:27 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39281106&tid=1887787]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
1004ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 1322ms |

| 0 / 0 |
