Оценка стоимости
В оптимизаторах DB2 используется основанная на стоимости модель, оценивающая стоимость ресурсов ввода-вывода и ЦП и затем образуя из этих оценок общую стоимость. В DB2 для MVS стоимость ресурсов ЦП нормализуется на основе скорости процессора. В DB2 для MVS соответствующие веса ввода-вывода и ЦП определяются при инсталляции системы путем замера времени выполнения небольших программ с известным числом команд, обращающихся к фиксированному числу страниц.
Оценочные формулы для ЦП получаются путем анализа числа команд, требуемых для различных операций, таких как получение страницы, вычисление предиката, переход к следующему элементу индекса, вставка во временную таблицу, разворачивание строки данных (это делается по одной строке) и т.д. Командная стоимость этих операций тщательно валидирована и является настолько же точной, как и оценки поведения ввода-вывода и размера результата.
Более сложно надежно оценить стоимость ввода-вывода. Должны делаться предположения о доступности пула буферов и кластеризации данных. Как правило, в DB2 для MVS предполагается, что для каждой конкретной таблицы доступен очень малый процент пула буферов. Однако, если имеется высокий уровень локальности ссылок (как во внутреннем индексе, возможно, во внутренней таблице соединения вложенными циклами или индексе внутренней таблицы при гибридном соединении), принимается более либеральное предположение о том, останется ли страница данных или индексная страница в основной памяти в течение выполнения запроса.
В DB2 для MVS индексные деревья имеют 3 или 4 уровня. Моделирование процентов удачи буферного пула для этих уровней является очень важным для клиентов, производящих оперативную обработку транзакций над большими (более 10M строк) таблицами. На ввод-вывод страниц данных влияют особенности запроса, размер пула буферов и степень кластеризации данных с общими значениями в страницах данных. В формулах для доступа к данным через отсортированный список RID’ов учитываются размер таблицы, степень кластеризации индекса и селективность предикатов на индексе.
В DB2 для MVS пользователю разрешается задавать на любом запросе раздел OPTIMIZE FOR N ROWS, чтобы указать, что по курсору будут прочитаны только N строк до его закрытия [DB293c]. В этом случае DB2 для MVS разделяет общую стоимость на затраты, ассоциируемые с открытием курсора, и затраты на каждое чтение строки. Выбирается план, который будет меньше всего стоить для открытия и N чтений, и этот план может существенно отличаться от плана, оптимального при отсутствии такого раздела.
Если выбирается план «N строк», то DB2 для MVS может отключить упреждающее чтение (обсуждаемое в разд. 7.2), если устанавливается, что для возврата N строк потребуется всего несколько страниц данных. Упреждающее чтение может привести к чтению 64 индексных страниц и 64 страниц данных при выборке всего одной строки. Это составляет около 0.5 Мб данных, которые потребуется прочитать с диска и поместить в буферный пул, и большая часть которых не требуется. Такая дополнительная работа будет стоить заказчику десятки тысяч долларов в год за счет расходов на ввод-вывод, память и ЦП. По причине неизбежной неточности в показателях фильтрации и статистики для случая OPTIMIZE FOR 1 ROWS был написан специальный код для выбора плана, в котором, по возможности, избегается сортировка (данных или RID’ов), независимо от того, будет ли запрос, по оценке оптимизатора, выдавать ровно одну строку.