26
Выбор лучшего плана
Перебор планов
порядок соединений, способы соединений, методы доступа
по возможности полный перебор,
при большом числе вариантов — сокращение пространства поиска
Простые запросы и подготовленные операторы
оптимизируется время получения всех строк
минимальная полная стоимость
Курсоры
оптимизируется время получения части первых строк
минимальная стоимость получения cursor_tuple_fraction строк
Оптимизатор старается перебрать все возможные планы выполнения
запроса, чтобы выбрать из них лучший.
Для сокращения перебора используется алгоритм динамического
программирования, но при большом количестве вариантов (в первую
очередь из-за числа соединяемых таблиц) точное решение задачи
оптимизации за разумное время становится невозможным. В таком
случае планировщик сокращает количество перебираемых планов,
либо рассматривая не все варианты попарных соединений, либо
переключаясь на генетический алгоритм оптимизации (GEQO —
Genetic Query Optimization). Это может привести к тому, что
оптимизатор выберет не лучший план не из-за ошибок в оценке, а
просто потому, что лучший план не рассматривался.
Что же считается «лучшим планом»?
Для обычных запросов это план, минимизирующий время получения
всех строк, то есть план с минимальной полной стоимостью.
Однако при использовании курсоров может быть важно как можно
быстрее получить первые строки. Поэтому существует параметр
cursor_tuple_fraction (значение по умолчанию 0.1), задающий долю
строк, которую надо получить как можно быстрее. Чем меньше
значение этого параметра, тем больше на выбор плана влияет
начальная стоимость, а не полная.