|
|
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Добрый день. Столкнулся с проблемой неоптимальных планов. Вводные. Версия oracle 12.1.0.2.0. Есть большая партиционированная табличка (tab1, key1 - ключ партиционирования, key2 - ключ субпартиционирования). Данные по партициям распределены неравномерно. Статистика собрана. Есть процедура на pl/sql, в которой довольно большой запрос, использующий данную табличку(соединения, аналитика и т.д., не суть). Входными параметрами передаются значения (in_p1, in_p2), по которым определяется требуемая при выборке субпартиция. Если совсем упрощенно, то SELECT * FROM tab1, tab2 WHERE key1=in_p1 AND key2=in_p2 AND tab1.id=tab2.id; Проблема При построении плана оценка количества строчек при выборке из таблицы в десятки раз расходится с реальностью для конкретных значений. Как итог, неоптимальный план. Если вместо переменных подставить реальные значения, то план корректный. Кто-нибудь сталкивался с подобным? Какие есть варианты решения, кроме перехода на динамический sql и изменения плана хинтами? P.S. Пробовал alter session set "_disable_cursor_sharing" = true; и alter session set "_optim_peek_user_binds"=false; Изменений в части оценки количества строчек не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 15:22 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Idini4ka.. Если вместо переменных подставить реальные значения, то план корректный... запрос перепроверьте на соответствие типов атрибутов столбцам таблицы (особенно ключевых) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 16:32 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Idini4kaДанные по партициям распределены неравномерноесли неравномерно, и большая часть запросов работает с известной частью партиций - хинтовать надо. Ораклятина-то не знает с какой частью перекошенных данных вы собираетесь работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 17:02 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Ораклятина-то знает, если статистика собиралась с глистограммами Вот только первый вызов с биндами может сформировать плохой (в общем случае, для данного вызова как раз оптимальный) план, а дальнейшие вызовы будут его использовать. Если все так уж перекошено, то, может быть, есть смысл разделить операторы в зависимости от key1-key2 -- добавить, например комментарии. Т.е. сформировать несколько планов и дергать их не через NDS, а через IF-THEN-ELIF-... Ну и вроде как Adaptive Cursor Sharing должен со 2-3 вызова это сам разрулить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 17:14 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
orawishзапрос перепроверьте на соответствие типов атрибутов столбцам таблицы (особенно ключевых) Все корректно. --Eugene--если неравномерно, и большая часть запросов работает с известной частью партиций - хинтовать надо. Ораклятина-то не знает с какой частью перекошенных данных вы собираетесь работать. Вот мне кажется, что где-то в этом направлении и проблема. Такое чувство, что план берется для другого набора bind переменных. Можно ли как-то заставить оптимизатор проверять значения переменных перед построением плана? С хинтами не получится, так как число запусков для каждой партиции одинаково. Добавлю, что запусков в сутки относительно немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 17:21 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Idini4kaзапусков в сутки относительно немного.Тогда использовать NDS+литералы и перестать беспокоиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 17:28 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровЕсли все так уж перекошено, то, может быть, есть смысл разделить операторы в зависимости от key1-key2 -- добавить, например комментарии. Т.е. сформировать несколько планов и дергать их не через NDS, а через IF-THEN-ELIF-... Думал над этим. Но тогда придется поддерживать в актуальности несколько версий одного и того же кода. Это не очень удобно. Вячеслав ЛюбомудровНу и вроде как Adaptive Cursor Sharing должен со 2-3 вызова это сам разрулить Различных значений key1 немного, а вот key2 - это дата (каждый день новая). Возможно, это и влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 17:33 |
|
||
|
Статистика, bind переменные, партиционирование
|
|||
|---|---|---|---|
|
#18+
UP. Появилась еще идея разбить табличку на несколько по числу партиций, тогда распределение внутри каждой таблицы получится более или менее равномерное, но хотелось бы обойтись без этого. Есть у кого-нибудь еще идеи/варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 11:05 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1886452]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 449ms |

| 0 / 0 |
