How to set _optimizer_search_limit and _optimizer_max_permutations in Oracle10g

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

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

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

Благодарю.

2 ответа

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

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

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

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

select table_name, last_analyzed from user_tables

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

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

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

ALTER SESSION SET TIMED_STATISTICS = TRUE;

ALTER SESSION SET MAX_DUMP_FILE_SIZE = '2048M';

ALTER SESSION SET SQL_TRACE = TRUE;

ALTER SESSION SET tracefile_identifier = trace1_10053;

СОБЫТИЯ ПО СЛЕДУЮЩЕЙ СЕССИИ '10053 КОНТЕКСТ НАЗВАНИЯ ИМЯ ВНЕДРЕНИЯ, УРОВЕНЬ 1';

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

Другие вопросы по тегам