|
условие join не всегда выполняется до группировки
|
|||
---|---|---|---|
#18+
Добрый день! Использую oracle 11g. В некоторых случаях оракл понимает что на выборку накладывается ограничение (н.р. join on) и сначала обрабатывает это ограничение и только потом делает group by. Подробности в примере ниже. Я перепробовал все хинты, которые смог найти. Желаемого результата, чтобы TBL сначала фильтровался, потом группировался, я так и не смог достичь. На реальном примере я в итоге сделал подзапросом, но из-за того, что нужно было выбирать несколько полей, пришлось на каждое поле писать подзапрос и судя по графику выполнения эти подзапросы в один не сливаются. Вопрос: Как переписать запрос для оракл 11g (я видел в 12 появились какие-то таблицы-подзапросы), какие добавить хинты чтобы второй запрос отработал аналогично первому? --Первоначальное заполнение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
--Вариант 1: Оракл понимает что TBL сначала надо отфильтровать по ID1=1001,1002 и только потом сгруппировать (по индексу). --Выполняется за доли секунды SELECT * Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
--Вариант 2: Хотя запрос идентичный, но теперь оракл сначала группирует по всей выборке TBL (10млн) и только потом применяет фильтрацию. --Работает несколько секунд Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 12:03 |
|
условие join не всегда выполняется до группировки
|
|||
---|---|---|---|
#18+
OverDroneДобрый день! Я перепробовал все хинты, которые смог найти. Это какие? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 12:17 |
|
условие join не всегда выполняется до группировки
|
|||
---|---|---|---|
#18+
OverDrone, В доступе только 11.2.0.2. Там можно через подзапрос. Иначе не вижу простых вариантов JPPD. В 12c LATERAL (в 11g это есть, но не официально). Код: 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.
Можно отказаться от CONNECT BY Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 13:56 |
|
условие join не всегда выполняется до группировки
|
|||
---|---|---|---|
#18+
OverDrone, У JPPD есть известные ограничения на обычные популярные генераторы: OJPPD: OJPPD bypassed: query block contains START WITH/CONNECT BY. OJPPD: OJPPD bypassed: View contains TABLE expression. замените генератор на любой, который OJPPD поддерживает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2019, 15:36 |
|
условие join не всегда выполняется до группировки
|
|||
---|---|---|---|
#18+
SeaGate, connect by я привел просто в качестве примера. На проде у меня там piped function. Поведение оракла одинаковое в этих случаях, поэтому я для простоты не стал просто упоминать функцию. Проблема даже не в том, что оракл не может предугадать число строк (я пробовал и cardinality hint и ASSOCIATE STATISTICS с объектом), а в том, что если ограничения на айдишник он не может представить в виде условия, а не набора записей, то он не пытается этот набор записей подсунуть до group by, даже если там 1-2 записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2019, 17:02 |
|
|
start [/forum/topic.php?fid=52&msg=39855570&tid=1882133]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
143ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 526ms |
0 / 0 |