|
STOPKEY после PARTITION RANGE ITERATOR при динамическом partition pruning
|
|||
---|---|---|---|
#18+
Есть: таблица с range (ну или interval) партиционированием по дате. Нужно найти первую строку начиная с самой поздней партиции с заданными границами по дате партиционирования. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Если никаких фильтров на дату партиционирования нет, то всё хорошо - STOPKEY идёт сразу после TABLE ACCESS и до PARTITION RANGE ALL: Код: plsql 1. 2. 3. 4. 5.
Что получили: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Начали сканить с 4й по 1ю партицию, но просканили только одну, нашли 1 строку и закончили. Благодаря тому что STOPKEY находится под PARTITION RANGE ALL Если задать только правую границу, то тоже всё хорошо: Код: plsql 1. 2. 3. 4. 5. 6.
Получили: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
в общем-то, всё также, только теперь сканим не с 4й, а с вычисленной партиции, всё логично. С заданной только левой границей всё тоже самое, всё ожидаемо. А вот с обеими заданными границами начинаются проблемы: Код: plsql 1. 2. 3. 4. 5. 6. 7.
и получили лажу: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
STOPKEY теперь делается после PARTITION RANGE ITERATOR. Это приводит к тому что сканим 2 партиции, получаем 2 строки. Не понимаю, каким образом тут мешает (и мешает ли) появившийся фильтр(4) валидиции границ (правая >= левой) - :D_2020_01_12>=:D_2020_01_11 Подобное обсуждали вот тут , а прям конкретно эта проблема вот там (предложили написать d+0 >=, но это ерунда потому что ломает прунинг по левой границе). Что делать, неясно. Есть мысли? P.S. Проблема только с биндами - с литералами всё прекрасно. P.P.S. Тесткейс упростил максимально (в сравнении с бизнес задачей). Возможно, даже слишком - усложню, если нужно. P.P.P.S. 11.2, 19c - одинаково плохо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 18:22 |
|
STOPKEY после PARTITION RANGE ITERATOR при динамическом partition pruning
|
|||
---|---|---|---|
#18+
На мой взгляд это баг. Оптимизатор не видит, что в случае KEY/KEY партиции в PARTITION RANGE ITERATOR будут сканироваться по порядку, согласно сортировке. Workarounds: Код: plsql 1.
или Код: plsql 1.
в сессии или хинтом, например, Код: plsql 1.
Либо можно создать локальный индекс on TEST_PRUNING(d), чтобы вообще от сортировки избавиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2020, 22:58 |
|
|
start [/forum/topic.php?fid=52&fpage=45&tid=1881207]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
others: | 20ms |
total: | 148ms |
0 / 0 |