Настройка оптимизатора SQL
Ввиду различия режимов оптимизатора различен и результат их работы, поэтому важен выбор оптимизатора, используемого по умолчанию. Как правило, общепринятые цели настройки включают следующие задачи:
1) Устранение полного просмотра таблиц, путём создания индексов во всех случаях, когда стоимость индекса меньше стоимости полного просмотра. Т.е. заранее создать индексы для всех колонок, по которым придётся делать выборку.
2) Обеспечивание правильного использования всех индексных ресурсов оптимизатора. (стоимостной оптимизатор работает по индексам, по расположению данных)
3) Использования битовых индексов про любой возможности. Битовые индексы работает быстрее, в памяти места занимают меньше.
4) Использование стоимостных подсказок для повышения производительности запросов.
Файл InitOra – это настроечный файл СУБД Oracle, который фактически представляет собой обычный текстовый файл в стандарте Windows, в который можно забраться блокнотом и подправить. Там много-много строчек с настройками в т.ч. есть строчки и с настройками оптимизатора. Например, там может быть указана строка типа:
Optimizer-mode = rule — использовать продукционный оптимизатор независимо от статистики
Optimizer-mode = all_rows — минимизирует ресурсы, обычно приводит к полному просмотру таблицы
Optimizer-mode = First_rows — минимизирует время отклика, обычно приводит к индексному просмотру и использованию стоимостного оптимизатора
Optimizer-mode = Chose — система принимает решение сама
Для продукционного оптимизатора очень важна редакция запроса, т.е. текст запроса, поэтому таблицы в разделе Row надо указывать в порядке убывания числа выбираемых строк. (т.е. первую надо писать таблицу, из которой больше строк выбирается) Так правильно писать запрос для продукционного оптимизатора. (это для раздела Select.From);
(раздел Select .Where) наибольшее ограничение на выборку строк должно стоять первым, если условия выборки включают оператор «or», а если соединение оператора «and», то наоборот.
Оптимизатор не умеет менять местами таблицы, ограничения, поэтому ему лучше сразу указывать в правильном порядке.
Несмотря на существенные нововведения в стоимостной оптимизатор Oracle, во многих случаях продукционный оптимизатор считается предпочтительней. Во-первых, он появился с первой версией Oracle, а стоимостной только с шестой. (т.е. много поколений людей вложили свой талант в этот оптимизатор).
Общая стратегия настройки оптимизатора Oracle следующая:
1) к запросам, которые соединяют 3 или более крупных таблицы, следует применять продукционный оптимизатор или (стоймостной) подсказку First_rows.
2) Запросы, обращающиеся к битовым индексам, выигрывают при стоимостном оптимизаторе.
3) Запросы с использование подсказок без звёздообразного запроса нуждаются в стоимостном оптимизаторе. (звёздообразный запрос – когда одна большая таблица и много маленьких у неё)