|
|
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
Добрый день, Столкнулся с такой ситуацией: Скрипт: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. В подзапросе T для даты 29 данные есть для даты 30 данных нет Чищу системный кеш: Код: plsql 1. 2. Выполняю цикл. Цикл выполнился быстро . Для 29 подольше, для 30 моментально. Далее меняю порядок дат: Код: plsql 1. 2. 3. Чищу кеш. Выполняю цикл. Цикл выполняется долго . Долго висит на 29 . Session Browser показывает затянутое выполнение Long Ops и план запроса с Nested Loops, вместо логичного Hash. Складывается такое понимание. Oracle выполняет цикл, строит план запроса в рамках первой итерации и использует его во всех следующих итерациях. Если merge вне цикла, то для даты 29 план запроса содержит Hash для даты 30 план запроса содержит Nested Loops Оба выполняются быстро. Пока найдено такое решение: использовать внутри цикла Код: plsql 1. Вопрос. Есть ли команды, аналогичные Код: plsql 1. 2. для очистки кеша внутри сессии, конкретной схемы(пользователя)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 14:17 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
AntonioPermskiy, авторСкладывается такое понимание. Oracle выполняет цикл, строит план запроса в рамках первой итерации и использует его во всех следующих итерациях. Если дата передается как bind_variable - то да, так и есть. План построится для первого подсмотренного бинда ( bind_peeking ), после чего будет некоторое время использоваться для всех таких запросов. Это время регулируется “_cursor_bind_capture_interval” , по дефолту - 15 минут. Если подставить дату как константу, а не бинд. переменную - такого не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 14:32 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
AntonioPermskiy Вопрос. Есть ли команды, аналогичные Код: plsql 1. 2. для очистки кеша внутри сессии, конкретной схемы(пользователя)? Планы находятся в общем кэше ( в этом собственно весь смысл их хранения - переиспользование между сессиями), так что чистить кэш "внутри сессии" бессмысленно, что бы вы под этим ни подразумевали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 14:37 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
План можно попытаться Hint'ами подсказать оптимизатору Чистить ради этого кэш совсем не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 14:43 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevПлан можно попытаться Hint'ами подсказать оптимизатору Чистить ради этого кэш совсем не обязательно. Хинты - зло. Уж лучше уж динамик, как сделал автор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:02 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
На вкус и цвет все фломастеры разные Можно хинтовать - что является злом Можно засирать SGA - что тоже зло Счастья нигде нет. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:06 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
ValergradХинты - зло. Уж лучше уж динамик, как сделал автор.Ежехардпарс не гарантирует оптимальности запроса. Сейчас оптимизатор на данную дату корректно определяет кардиналити, потом появились данные вне гистограмм или гистограммы изменились после сбора статистики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:10 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
Valergrad, Спасибо за сообщения. В merge внутри цикла я просто подставляю i.dat . Бинд это или нет, сходу, не знаю. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:22 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
AntonioPermskiyВ merge внутри цикла я просто подставляю i.dat . Бинд это или нет, сходу, не знаю. Код: plsql 1. 2. 3. 4. 5. это не бинд и Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:38 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
AntonioPermskiy, на пробу, заменить Код: plsql 1. 2. 3. 4. на Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:50 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
FogelAntonioPermskiyВ merge внутри цикла я просто подставляю i.dat . Бинд это или нет, сходу, не знаю. Код: plsql 1. 2. 3. 4. 5. это не бинд А что это если не бинд? Это бинд конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 15:58 |
|
||
|
For..loop..merge..endloop. План запроса по первой итерации
|
|||
|---|---|---|---|
|
#18+
AntonioPermskiyValergrad, Спасибо за сообщения. Бинд это или нет, сходу, не знаю. Это бинд. Кстати, вы можете это узнать и сами просто посмотрев план запроса. Если смотреть план запроса через dbms_xplan, то с опцией +PEEKED_BINDS вы увидите дополнительную секцию с биндами, в которой вы сможете даже посмотреть какое реально значение забиндовалось ( это и будет соответственно 29-е или 30-е - в зависимости от порядка ). Если вы им пользуетесь, то он лежит как обычно - в v$sql_plan в xml-е. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2018, 16:00 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39646226&tid=1883974]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
186ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 459ms |

| 0 / 0 |
