Назад | Перейти на главную страницу

Как установить _optimizer_search_limit и _optimizer_max_permutations в Oracle10g

Я работаю над продуктом, который должен поддерживать как MSSQL, так и Oracle (10g и 11g). У меня есть несколько очень сложных запросов, которые, кажется, выполняются без проблем на MSSQL 2005/2008, но очень, очень медленно работают с Oracle. ЦП на сервере Oracle взлетает до небес в течение длительных периодов времени, и кажется, что оптимизатор пытается найти лучший план выполнения для очень сложного запроса. Я немного погуглил, чтобы выяснить, как ограничить время, которое оптимизатор тратит на это, и придумал _optimizer_search_limit и _optimizer_max_permutations. Оба этих параметра скрыты в Oracle 10g, и установка их в init.ora, похоже, не имеет никакого значения.

Как установить эти параметры в Oracle.

Или я просто выкрикиваю не то дерево, полагая, что оптимизатор тратит несколько минут на поиск плана выполнения?

Спасибо.

Похоже на ошибку, которую уже можно было решить. Сколько таблиц в объединении?

Вы можете выполнить трассировку 10053, чтобы выяснить, что происходит с CBO.

ALTER SESSION SET TIMED_STATISTICS = TRUE;

ALTER SESSION SET MAX_DUMP_FILE_SIZE = '2048M';

ALTER SESSION SET SQL_TRACE = TRUE;

ИЗМЕНИТЬ НАБОР СЕССИИ tracefile_identifier = trace1_10053;

ИЗМЕНИТЬ СОБЫТИЯ НАБОР СЕССИИ «10053 КОНТЕКСТ НАЗВАНИЯ ИМЕНИ НАВСЕГДА, УРОВЕНЬ 1»;

а затем загляните в файл трассировки, чтобы проверить, верна ли ваша теория о зависании CBO. 12c имеет ограничение всего 2000 _optimizer_max_permutations, так что это не займет много времени. В 10g-11g, я полагаю, раньше было около 60k.

Никогда не слышал о запросе, для оптимизации которого требуется 15 минут.

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

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

Вы можете увидеть, есть ли у вас (недавняя) статистика с этим

select table_name, last_analyzed from user_tables

Если вы имеете дело со сложными запросами к большим таблицам, вам следует потратить некоторое время на планирование стратегии сбора статистики.