2009-07-14 2 views
2

Похоже, что на некоторых из серверов, которые у нас есть, стоимость хеш-соединений, группировка и порядок слишком малы по сравнению с действительная цена. То есть часто планы выполнения с индексами диапазона индексов превосходят прежние, но по плану объяснения стоимость отображается выше.Как увеличить оценку стоимости CBO для Oracle для хеш-соединений, по группам и по заказам без подсказок

Некоторые дополнительные примечания:

  1. Я уже установлен optimizer_index_cost_adj до 20 и это все еще не достаточно хорошо. Я НЕ хочу увеличивать стоимость чистых полных сканирований таблицы, на самом деле я бы не прочь оптимизатор, уменьшающий стоимость.
  2. Я заметил, что pga_aggregate_target оказывает влияние на оценки стоимости CBO, но я определенно НЕ хочу понижать этот параметр, так как у нас много ОЗУ.
  3. В отличие от использования подсказок оптимизатора в отдельных запросах, я хочу, чтобы настройки были глобальными.

Edit 1: Я думаю о экспериментировать с динамической выборкой, но не имеет достаточно глубоких знаний, чтобы предсказать, как это может повлиять на общую производительность, то есть, как часто планы выполнения могут измениться. Я определенно предпочел бы что-то, что очень стабильно, ведь для некоторых наших крупнейших клиентов у нас есть политика блокировки всех статистических данных (что изменится с помощью Oracle 11g SQL Plan Management).

+0

Можете ли вы привести пример плана объяснения? – FerranB

+0

Вы можете поэкспериментировать с различными настройками (например, с помощью динамической выборки), но как вы узнаете, эффективны ли ваши изменения или нет? Вместо этого выработайте ПОЧЕМУ планы, как правило, плохие, и тогда вы окажетесь на полпути к поиску наилучшего решения. –

+0

Я знаю, почему - из-за неуместной оценки стоимости хеш-соединений, групповых и порядковых байтов (но не FTS). И это то, что я пытаюсь настроить. –

ответ

2

Довольно часто, когда планы выполнения с просмотром диапазона индексов превосходят те, у которых есть полные проверки + сортировки или хеш-соединения, но CBO собирает полные проверки, потому что оптимизатор полагает, что он найдет больше подходящих результатов, чем на самом деле реальная жизнь.

Другими словами, если оптимизатор считает, что он будет получать 1M строк из таблицы A и 1000 строк из таблицы B, он вполне может выбрать полное сканирование + сортировать объединение или хеш-соединение; если, однако, когда он действительно запускает запрос, он получает только 1 строку из таблицы A, сканирование диапазона индекса может быть лучше.

Сначала я рассмотрел некоторые плохо выполняемые запросы и проанализировал избирательность предикатов, определит, делает ли оптимизатор разумные оценки количества строк для каждой таблицы.

EDIT: Вы упомянули, что оценки мощности неверны. Это основная причина ваших проблем; калькуляция хеш-соединений и сорта, вероятно, вполне нормально. В некоторых случаях оптимизатор может использовать неправильные оценки, потому что он не знает, сколько данных коррелировано. Гистограммы в некоторых столбцах могут помочь (если вы еще не получили их), и в некоторых случаях вы можете создавать индексы на основе функций и собирать статистику по скрытым столбцам для предоставления еще более качественных данных оптимизатору.

В конце дня ваш трюк с указанием мощностей различных таблиц в запросах вполне может потребоваться для получения удовлетворительной производительности.

+0

Анализируются все таблицы и индексы. Большинство запросов используют переменные связывания и называются тысячи/миллионы раз, поэтому их нельзя преобразовать в использование литералов. –

+1

Просто быть «проанализированным» недостаточно. Вам может потребоваться изучить, какие столбцы могут извлечь выгоду из гистограмм или может извлечь выгоду из NOT, имеющих гистограммы. Вместо того, чтобы смотреть на сметы расходов, посмотрите на оценки ROWS и посмотрите, насколько они точны. –

+0

Оценка строк неверна (мощность обычно слишком низкая), но даже тогда я получаю запросы, которые поддерживают хеш-соединения при сканировании диапазона индексов. Несколько раз мне приходилось намекать на искусственно низкую мощность, чтобы заставить сканирование диапазона индекса. –