Методы, позволяющие избегать дорогостоящих операций
В оптимизаторах DB2 используется много методов минимизации дорогостоящих операций.
Если много предикатов соединяются предикатами AND, то вычисление первого из этих предикатов, которое наиболее вероятно приведет к FALSE, обеспечит наилучшую производительность. Когда в DB2 для MVS вычисляются предикаты на таблице или индексе, эти предикаты разделяются на «классы», или типы. Предикаты, относящиеся к типам, которые более вероятно выдадут FALSE, вычисляются первыми. Первыми вычисляются предикаты сравнения на равенство (этот тип включает и предикат IS NULL), затем вычисляются предикаты проверки вхождения в диапазон, затем – прочие предикаты, и последними вычисляются предикаты с подзапросами. Внутри данного класса предикатов предикаты вычисляются в порядке их появления в списке SELECT. Как показывает опыт заказчиков, лучше предоставить пользователю возможность контроля над порядком вычисления предикатов внутри класса, поскольку вычислениям показателя фильтрации не всегда можно доверять.
Все продукты DB2, насколько это возможно, избегают временных таблиц и сортировки (для чего сначала требуется собрать все строки во временной таблице), поскольку это дорого и задерживает доставку первых строк пользователю. Например, соединения методом вложенных циклов позволяют сравнить единственную внешнюю строку с несколькими внутренними строками и немедленно вернуть строку пользователю. Если невозможно избежать временных таблиц, то они накапливаются в основной памяти и сбрасываются на диск только при исчерпании доступной буферной памяти.
Все сортировки, требуемые для GROUP BY и ORDER BY, если это возможно, комбинируются в одну сортировку путем переупорядочения столбцов GROUP BY. Для удовлетворения SELECT DISTINCT на надмножестве множества столбцов S может использоваться уникальный индекс на S, даже если этот индекс не используется в запросе, поскольку уникальный индекс определяет ключ на S и гарантирует, что в таблицу никогда не попадут дубликаты S. Аналогично, столбцы GROUP BY могут быть свободно переупорядочены в соответствии с порядком столбцов индекса, что обеспечивает требуемый порядок для GROUP BY, сохраняя сортировку.
Иногда знания об операции могут использоваться для ее более эффективного выполнения. Например, во всех продуктах DB2 вычисление подзапросов с EXISTS завершается немедленно после обнаружения первой требуемой строки. Кроме того, для выполнения запросов с агрегацией без GROUP BY можно использовать специальные индексы для завершения обработки немедленно после нахождения требуемой строки. Например, для выполнения запроса SELECT MAX(ORDER_NUMBER) FROM SALES
требуется выбрать всего лишь одну первую строку в порядке убывания индекса на ORDER_NUMBER.