|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Добрый день.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 18:07 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Если план уже начал выполняться, то перестраиваться не может. Как вариант посмотрите включён ли режим Automatic degree of Parallelism (ADOP). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 18:11 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Скорее всего adaptive plan - смотри план на предмет: Код: plsql 1. 2. 3.
Если да, то отключи и проверь (тем более что есть патч для 12.1 который, кроме всего прочего, разбивает optimizer_adaptive_features на optimizer_adaptive_plans и optimizer_adaptive_statistics). SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 18:30 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Vivat!San Если план уже начал выполняться, то перестраиваться не может. А как же адаптивные планы в 12-м Oracle ( https://oracle-base.com/articles/12c/adaptive-plans-12cr1 )? Сам об этом узнал, когда искал решение по своей проблеме, но, похоже, план, всё-таки может меняться в процессе выполнения запроса Vivat!San Как вариант посмотрите включён ли режим Automatic degree of Parallelism (ADOP). Похоже, что нет: parallel_degree_policy = 'MANUAL' для системы, на уровне сессии не переопределяется ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 18:54 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
SY Скорее всего adaptive plan - смотри план на предмет: Код: plsql 1. 2. 3.
Если да, то отключи и проверь (тем более что есть патч для 12.1 который, кроме всего прочего, разбивает optimizer_adaptive_features на optimizer_adaptive_plans и optimizer_adaptive_statistics). SY. Сам на них грешил, но, похоже, что нет: optimizer_adaptive_features = FALSE (DEFAULT_VALUE = TRUE) А в Note только (этот план я собрал не в период загрузки, но параметры БД не менялись): Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 18:58 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 А как же адаптивные планы в 12-м Oracle адаптивность в плане влияния на оптимизатор, но не на уже построенный план. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 19:05 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 Добрый день. Такое ощущение, что запрос просто в какой-то момент останавливается и начинает сначала и так много раз. В результате выполнение затягивается на много часов вместо 5-ти минут. Это может быть silent query restart. Параллельный запрос перезапускается заново ( с построением плана ) если в процессе его выполнения кто-то делает DDL по одной из таблиц которую он читает - это штатное поведение. Чтобы убедиться что запрос именно перезапускается заново проверьте поле sql_exec_id в gv$session ( или gv$active_session_history ). Если в процессе выполнения запросо это поле растет - то это именно оно. Также на это указывает большое число invalidations в gv$sql или gv$sqlstat. Проверьте - оно ли это. Если да, то подробности хорошо описаны в этой ноте: Oracle Support Document 751588.1 (Parallel Query Fails Intermittently With ORA-12842 Starting in RDBMS 10.2.0.4+) can be found at: https://support.oracle.com/epmos/faces/DocumentDisplay?id=751588.1 Решение в общем-то простое: избегать DDL по таблицам в момент работы подобных запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 19:07 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 добежал до 265-й строки плана, затем в Longops'ах появилась, например 795-я строка плана, а потом бац и снова 128-я. И так много раз Это нормально. Если лицензия позволяет, то понаблюдайте посредством dbms_sqltune.report_sql_monitor. Что касается множественности планов - то это возможно, см. child_no. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 19:08 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Vivat!San адаптивность в плане влияния на оптимизатор, но не на уже построенный план. Adaptive Query Optimization By far the biggest change to the optimizer in Oracle Database 12c is Adaptive Query Optimization. Adaptive Query Optimization is a set of capabilities that enable the optimizer to make run-time adjustments to execution plans and discover additional information that can lead to better statistics . This new approach is extremely helpful when existing statistics are not sufficient to generate an optimal plan. There are two distinct aspects in Adaptive Query Optimization: adaptive plans, which focuses on improving the execution of a query and adaptive statistics, which uses additional information to improve query execution plans. У меня в некоторых случаях "бешеный adaptive принтер" создавал более 300 child cursor на sql_id с разными планами. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 19:41 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
SY, да мы тоже имели много проблем с ним, но он может собрать статистику, если её не хватает, может ещё что-то на лету подставить по результатам выполнения таких же запросов, но он не может менять план, который уже в работе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 19:46 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Vivat!San но он не может менять план, который уже в работе. Согласен, но скорее всего у Valiot85 построение нового плана (у нас были случаи когда построение нового плана занимало несколько минут при том что со старым планом SQL выполнялся секунд за 40). SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 20:20 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
SY "бешеный adaptive принтер" создавал более 300 child cursor на sql_id с разными планами. SY. Хуже, когда этот принтер, "адаптировав" статистику, начинает генерировать неадекватные планы. С большой буквы Н. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 14:07 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valergrad Это может быть silent query restart. Параллельный запрос перезапускается заново ( с построением плана ) если в процессе его выполнения кто-то делает DDL по одной из таблиц которую он читает - это штатное поведение. Вот это очень похоже на правду, хотя я раньше думал, что в таких случаях возникает ошибка Object no longer exists Valergrad Также на это указывает большое число invalidations в gv$sql или gv$sqlstat. Да, invalidations действительно увеличено для этого запроса (не очень сильно: 10, но это вяжется с временем работы этого запроса: 30 минут вместо 5-ти) + проверил last_ddl_time объектов, которые используются в запросе - по некоторым таблицам оно как раз приходится на время загрузки. Как показало дальнейшее расследование, скорее всего дело в нашем регламентном процессе, который на время обновления таблицы делает индексы на ней невидимыми: Invisible индекса рождает обновление DDL таблицы, ну и следовательно, приводит к silent query restart. Есть некоторые несостыковки, конечно, например когда процесс грузился несколько часов, последний час, вроде, уже никаких DDL не должно было быть. Но проверить эти несостыковки сейчас уже нет возможности - V$SQL у нас обновляется довольно быстро. Завтра отпишу, помогло ли отключение этого процесса. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 14:28 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 в нашем регламентном процессе, который на время обновления таблицы делает индексы на ней невидимыми А какой профит получаете от невидимости индексов во время обновления? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 15:19 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
andrey_anonymous Valiot85 в нашем регламентном процессе, который на время обновления таблицы делает индексы на ней невидимыми А какой профит получаете от невидимости индексов во время обновления? Вопрос хороший, присоединяюсь. Невидимость индексов - она для оптимизатора. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 17:05 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
andrey_anonymous А какой профит получаете от невидимости индексов во время обновления? Обновление выполняется сложным MERGE'ем, на план которого, теоретически, может повлиять наличие лишнего индекса. На самом деле это была перестраховка, которая в итоге сыграла злую шутку ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 17:16 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85, не проще ли было хинт no_index заюзать... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 18:18 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
xtender Valiot85, не проще ли было хинт no_index заюзать... Под загрузку merge-м? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 18:48 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
xtender не проще ли было хинт no_index заюзать... Ну на самом деле всё довольно сложно, но если интересно, могу рассказать: Это вообще общий механизм, который генерит SQL для разных таблиц, при этом индекс на PK использовать нужно, а вот все остальные индексы - нет. Написать NO_INDEX(<имя индекса>) нельзя, потому что на всех таблицах индексы по-разному называются (можно конечно докрутить механизм, но было как-то неоправдано сложно для решения "на всякий случай"), написать NO_INDEX(<алиас таблицы>) тоже нельзя по описанной выше причине (один индекс всё же использовать нужно), а тут как раз механизм отключения индексов разрабатывали и решили его заюзать. В принципе можно было и без него, скорее всего оптимизатор сам примет правильное решение, но, казалось, почему бы и нет. Как-то так. Но вообще это уже оффтоп ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 18:53 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 Написать NO_INDEX(<имя индекса>) нельзя, потому что на всех таблицах индексы по-разному называются (можно конечно докрутить механизм, но было как-то неоправдано сложно для решения "на всякий случай"), написать NO_INDEX(<алиас таблицы>) тоже нельзя по описанной выше причине (один индекс всё же использовать нужно), а тут как раз механизм отключения индексов разрабатывали и решили его заюзать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2019, 20:43 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
-2- Не понял, чем перебор индексов для ddl оправданнее перебора индексов для хинтования. Если таки нужен один индекс то, очевидно, акпкбирать нужно этот один индекс +index(таблица индекс). Ладно, давайте всё по порядку:
Резюмируя: многое было завязано на существующие решения и архитектуру и так сделать было проще, но я уже понял, в чём просчитался ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2019, 17:18 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 Завтра отпишу, помогло ли отключение этого процесса. Всё сработало, огромное спасибо Valergrad и всем остальным, кто пытался помочь! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2019, 17:19 |
|
Множественное построение плана одного и того же запроса во время выполнения
|
|||
---|---|---|---|
#18+
Valiot85 конечные пользователи стали создавать индексы ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2019, 07:59 |
|
|
start [/forum/topic.php?fid=52&msg=39897572&tid=1881781]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 158ms |
0 / 0 |