Я работаю над продуктом, который должен поддерживать как 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
Если вы имеете дело со сложными запросами к большим таблицам, вам следует потратить некоторое время на планирование стратегии сбора статистики.