Классика баз данных - статьи

       

Правила, гарантирующие поглощение представлений


Правило 1. SELECT Merge (слияние SELECT)

Правило SELMERGE (таб. 2) принимает два блока SELECT, соединенные квантификатором F (например, запрос над соединением), и сливает их в один блок. Польза этого преобразования состоит в том, что оно обеспечивает возможность большего числа порядков соединения; в результируещем одном блоке SELECT оптимизатор планов может выбрать в качестве порядка соединений любую перестановку таблиц под квантификаторами F, в то время как в исходном запросе таблицы, ссылки на которые содержатся в табличном выражении (нижний блок), не могут чередоваться с таблицами верхнего блока. Заметим, что если мы применим это правило ко всем блокам запроса, то закончим преобразования с единственным блоком SELECT, так что это правило непосредственно ведет к реализации нашей Философии Перезаписи. Чтобы обеспечить применимость этого правила, другие правила этого раздела пытаются удовлетворить условие этого правила во многих возможных ситуациях.

Таб. 2. Правило 1 – SELMERGE

Некоторое усложение для обеспечения корректности правила нас заставляет ввести проблема дубликатов. Если временно проигнорировать дубликаты, должно быть ясно, почему это правило работает: это непосредственно следует из коммутативности соединений и применения предикатов. Поскольку соединения и предикаты коммутативны, мы можем чередовать их из нижнего и верхнего блоков, что эквивалентно тому, что мы можем их слить. Этот аргумент применяется напрямую в том случае, когда ни из верхнего, ни из нижнего блоков не удаляются дубликаты.

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

  • upper.head.distinct = TRUE: Это может произойти в одном из двух случаев:

      Если upper.body.distinct = ENFORCE, то любые дубликаты, производимые нижним блоком в исходном запросе, будут удалены верхним блоком, и, следовательно, слияние не приводит ни к потери, ни к появлению дубликатов.

    • Если upper.body.distinct = PRESERVE, то все F-квантификаторы в верхнем блоке производят множества без дубликатов.

      Содержание  Назад  Вперед