- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
17.4. Преобразование выражений
В этом разделе обсуждаются правила преобразования, которые могут оказаться по- лезными на стадии 2 процесса оптимизации. Подбор примеров и выяснение, чем именно эти правила могут быть полезны при оптимизации, оставляются в качестве уп- ражнений для читателя.
Конечно, читатель должен понимать, что в результате применения к какому-либо вы- ражению одного правила преобразования может быть получено выражение, к которому применимо другое правило преобразования. Например, среди исходных запросов нечас- то встречаются запросы, сформулированные с использованием двух последовательно выполняемых операций проекции (речь об этом пойдет ниже; см. второе правило из под- раздела об операциях выборки и проекции). Однако при преобразовании запросов по- добные выражения достаточно часто возникают как результат применения других пра- вил преобразования. (В этом смысле очень важным случаем является обработка пред- ставлений. Например, рассмотрим запрос "Выбрать все названия городов в представле- нии V", где представление V определено как проекция переменной-отношения поставщи- ков по атрибутам Si и CITY.) Иначе говоря, начиная с исходного выражения, оптимиза- тор будет шаг за шагом применять различные правила преобразования до тех пор, пока не будет получено выражение, которое согласно встроенным в оптимизатор эвристиче- ским правилам будет считаться "оптимальным" для рассматриваемого запроса.
Выборки и проекции
Начнем с правил преобразования, которые включают только операции выборки и проекции.
1. Последовательность операций выборки из одного и того же отношения может быть заменена единственной операцией выборки из этого отношения (причем условные выражения всех исходных операций с помощью операций AND объединяются в од- но условное выражение). Например, выражение
( A WHERE <выборка1> ) WHERE <вы6орка2>
эквивалентно выражению
A WHERE <выборка1> AND <выборка2>
2. В последовательности операций проекций для одного и того же отношения можно игнорировать все проекции, кроме последней. Таким образом, выражение
( А { <проекция1> } ) { <проекция2> }
эквивалентно выражению
А { <проекция2> }
Конечно, чтобы исходное выражение имело смысл, каждый атрибут, присутст- вующий в проекции <проекцня2>, обязательно должен присутствовать и в проек- ции <проекция1>.
3. Операцию выборки из результата операции проекции можно преобразовать в опе- рацию проекции для результата операции выборки. Например, выражение
( А { <проекция> } ) WHERE <вы6орка>
эквивалентно выражению
( A WHERE <выборка> ) { <проекщя> }
Обратите внимание, что, как правило, операцию выборки целесообразно выполнять перед операцией проекции, поскольку операция выборки обычно приводит к уменьшению объема тех данных, которые будут являться входными для операции проекции. Следовательно, в этом случае уменьшается количество данных, которые потребуется сортировать для исключения возможных дублирующихся записей, об- разующихся в процессе выполнения операции проекции.
Распределительный закон
Правило преобразования, которое использовано в примере, приведенном выше, в разделе 17.2 (преобразование операции соединения с последующей операцией выборки в операцию выборки с последующей операцией соединения), на самом деле является част- ным случаем более общего правила, называемого распределительным законом. Говорят, что унарный оператор f распределяется по бинарной операции О тогда и только тогда, когда для всех Л и В выполняется следующее тождество.
i(AOB)=t(A)Ot(B)
Например, в обычной арифметике операция SQRT (извлечение квадратного корня) распределяется по операции умножения, так как для всех А и В выполняется приведенное ниже тождество.
SQRT ( А * В ) е SQRT ( Л ) * SQRT ( В )
Следовательно, выполняя преобразование выражений, оптимизатор арифметических выражений всегда может заменить одну часть этого равенства другой. В качестве обрат- ного примера можно привести утверждение, что операция SQRT не распределяется по операции сложения, так как в большинстве случаев квадратный корень из суммы А + В не равен сумме квадратных корней из Л и В.
В реляционной алгебре операция выборки распределяется по операциям объедине- ния, пересечения и вычитания. Она также распределяется по операции соединения, но лишь тогда и только тогда, когда условие операции выборки состоит (в самом сложном случае) из двух отдельных условий, соединенных операцией AND — по одному условию выборки для каждого операнда операции соединения. Для примера, рассматриваемого в разделе 17.2, сформулированное выше условие соблюдено (условие выборки очень про- стое и относится лишь к одному из операндов), благодаря чему стало возможным при- менить распределительный закон для замены рассматриваемого в примере выражения его более эффективным эквивалентом. Благодаря этому закону операция выборки была выполнена раньше остальных операций. Предварительное выполнение операций выбор-
ки почти всегда себя оправдывает, так как приводит к существенному уменьшению ко- личества кортежей, обрабатываемых следующей операцией, а также, возможно, к уменьшению количества кортежей на выходе этой операции.
Ниже приведено несколько примеров более специфических случаев применения рас- пределительного закона, на этот раз для операции проекции. Во-первых, операция про- екции распределяется по операциям объединения и пересечения (но не по операции вычитания).
( A UNION В){С}=А{С} UNION В { С }
( A INTERSECT В){С}=А{С} INTERSECT В { С }
Здесь А и В должны иметь одинаковые типы. Во-вторых, эта операция также распре- деляется по операции соединения, т.е. тождество
( A JOIN В ) { С } s ( А { АС } ) JOIN ( В { ВС } )
справедливо, но только в том случае, если:
множество АС является объединением общих атрибутов отношений А и В, плюс те атрибуты из множества С, которые имеются только в отношении А;
множество ВС является объединением общих атрибутов отношений А и В, плюс те атрибуты из множества С, которые имеются только в отношении В.
Эти законы можно использовать для организации предварительного выполнения опе- раций проекций, что обычно себя оправдывает по тем же причинам, что и в случае опе- раций выборки.
Коммутативность и ассоциативность
Законы коммутативности и ассоциативности являются двумя еще более важными и общими правилами преобразования. Говорят, что бинарная операция О является ком- мутативной тогда и только тогда, когда для всех А и В истинно следующее тождество.
А О В ш В О А
Например, в обычной арифметике операции умножения и сложения являются комму- тативными, а операции деления и вычитания — нет. В реляционной алгебре коммута- тивными являются операции объединения, пересечения и соединения, а операции вы- читания и деления таковыми не являются. Например, если запрос включает соединение двух отношений, А и В, то коммутативность означает, что безразлично, какое из отноше- ний А и В выбрано в качестве "внешнего" или "внутреннего". Следовательно, при вычис- лении данного объединения системе предоставлено право выбора в качестве "внешнего", например, меньшего из двух отношений (см. раздел 17.7).
Перейдем к ассоциативности. Принято считать, что бинарная операция О является ассоциативной, если для всех А, Ви С истинно следующее тождество.
АО{ВОС) = (АОВ)ОС
Например, в обычной арифметике произведение и сложение — ассоциативные опе- рации, а деление и вычитание— нет. В реляционной алгебре ассоциативными являются операции объединения, пересечения и соединения, а операции вычитания и деления таковыми не являются. Так, например, если в запросе используется соединение трех от-
ношений, А, В и С, то из законов коммутативности и ассоциативности следует, что не имеет значения, в каком порядке будет выполняться соединение отношений. Поэтому в процессе вычисления подобного соединения системе предоставляется право выбора наи- более эффективной последовательности из всех существующих.
Идемпотентность
Еще одним важным общим правилом является закон идемпотентности. Бинарную операцию О называют идемпотентной тогда и только тогда, когда для любого Л выпол- няется следующее тождество.
А О A s Л
Можно ожидать, что применение закона идемпотентности окажется полезным в про- цессе преобразования выражений. В реляционной алгебре операции объединения, пересе- чения и соединения являются идемпотентными, а операции деления и вычитания — нет.
Вычисляемые скалярные выражения
Объектом применения законов трансформации являются не только реляционные вы- ражения. Например, выше уже упоминалось, что некоторые законы трансформации при- менимы и к арифметическим выражениям. Вот конкретный пример. Вследствие того, что операция умножения "*" распределяется по операции сложения "+", выражение
Л * В + А * С
можно трансформировать в выражение
Л * j В + С )
Оптимизатор реляционных выражений должен знать о возможности подобных пре- образований, так как ему приходится иметь дело с вычисляемыми скалярными выраже- ниями в контексте операций EXTEND и SUMMARIZE.
Следует отметить, что приведенный выше пример иллюстрирует несколько более общую форму распределительного закона. Выше было дано определение понятия рас- пределяемое™ по отношению к унарным операциям, распределяемым по бинарным опе- рациям. Однако в данном случае обе операции, "*" и "+", являются бинарными. Говорят, что бинарная операция 8 распределяется по бинарной операции О, если для всех А, В и С истинно равенство
Л5(ВОС) = (Л5В)0(Л5С)
(в приведенном выше арифметическом примере 5 представляет операцию "*", а О — операцию "+").
Логические выражения
Перейдем к обсуждению логических выражений (иначе называемых булевыми выра- жениями или условиями), результатами вычисления которых могут быть только значения истина иложь. Предположим, что А и В — это атрибуты двух различных отношений, то- гда условие (которое может быть частью запроса)
А > В AND В > 3
абсолютно эквивалентно выражению А > В AND В > 3 AND А > 3
и потому может быть преобразовано в это выражение.
Данная эквивалентность базируется на том основании, что операция ">" является транзитивной. Заметьте, что подобное преобразование весьма полезно, так как позволя- ет системе выполнить дополнительную операцию выборки (по А) до выполнения "больше чем"-соединения, заданного условием А > В. Повторим сказанное выше. Пред- варительное выполнение операций выборки чаще всего оправдывает себя, следовательно, будет полезной и способность системы логически выводить предвари- тельные операции выборки (что и было реализовано в данном примере).
Замечание. Этот прием реализован в различных коммерческих продуктах, включая СУБД DB2 (в которой его называют транзитивным замыканием предикатов), а также СУБД INGRES.
Вот еще один пример. Вследствие того, что операция OR распределяется по операции AND, логическое выражение
А > В OR ( С = D AND Е < F )
можно преобразовать в выражение
( А > В OR С = D ) AND ( А > В OR Е < F )
Этот пример демонстрирует другой общий закон: "Любое условие может быть пре- образовано в эквивалентное условие, называемое конъюнктивной нормальной фор- мой (КНФ)". Выражение в КНФ в общем случае имеет следующий вид.
CI AND С2 AND ... AND Сп
Здесь CI, С2,Сп— это логические выражения (называемые конъюнктами), в которых не используется логическая операция AND. Преимущество КНФ состоит в том, что выражение в КНФ истинно только в том случае, если истинны все его конъюнкты. И наоборот, выраже- ние в КНФ ложно, если ложь является результатом вычисления хотя бы одного конъюнкта. Так как логическая операция AND коммутативна (выражение A AND В эквивалентно выраже- нию BAND А), оптимизатор может вычислять отдельные конъюнкты в любом порядке, в част- ности по возрастанию их сложности (начиная с самых простых). Как только будет найден конъюнкт, результатом вычисления которого является ложь, процесс вычисления выражения в КНФ можно будет прекратить. Более того, в системах с параллельной обработкой возможно параллельное вычисление каждого из конъюнктов [ 17.58]—[ 17.61 ]. Опять же, как только будет найден первый конъюнкт, результатом вычисления которого является значение ложь, про- цесс вычисления выражения в КНФ можно будет прекратить.
Из сказанного выше следует, что оптимизатор должен знать, как общие свойства, та- кие как распределенность, применяются не только к реляционным операциям, но и к операторам сравнения, например ">", к логическим операторам, например AND и OR, к арифметическим операторам, например "+", и т.п.
Семантические преобразования
Рассмотрим следующее выражение. ( SP JOIN S ) { Pi }
Данное соединение относится к соединениям типа внешний ключ — соответствующий потенциальный ключ. В нем внешнему ключу в переменной-отношении SP ставится в соот- ветствие потенциальный ключ в переменной-отношении S. Следовательно, каждый кортеж в переменной-отношении SP связан с определенным кортежем в переменной-отношении S. Таким образом, из каждого кортежа в переменной-отношении SP в общий результат посту- пает только значение атрибута Р|. Другими словами, соединение можно вообще не выпол- нять! Рассматриваемое выражение можно заменить следующим выражением.
SP { Р| }
Тем не менее будьте внимательны — подобное преобразование применимо только в силу семантики (смысла) конкретной ситуации. В общем случае каждый операнд в опе- рации соединения вносит в соединение кортежи, которые не имеют дополняющих их кортежей в других операндах и, следовательно, не попадающих в общий конечный ре- зультат. Поэтому чаще всего преобразования подобного типа будут некорректны. Одна- ко в рассматриваемом конкретном случае каждый кортеж в переменной-отношении SP обязательно имеет соответствующий ему кортеж в переменной-отношении S согласно установленному ограничению целостности (фактически это ограничение ссылочной це- лостности), которое гласит, что каждая поставка деталей должна быть связана с опреде- ленным поставщиком. Следовательно, учитывая это замечание, можно утверждать, что в данном случае рассматриваемое преобразование вполне корректно.
Преобразование, которое является корректным только в силу конкретного установ- ленного ограничения целостности, называют семантическим преобразованием [17.27], а оптимизацию, достигаемую в результате подобных преобразований, — семантической оптимизацией. Семантическую оптимизацию можно определить как процесс преобра- зования одного запроса в другой, качественно отличный запрос, который, тем не менее, дает результат, идентичный результату исходного запроса, благодаря тому, что обраба- тываемые данные удовлетворяют определенному ограничению целостности.
Важно понимать, что, в принципе, любое ограничение целостности может быть ис- пользовано для семантической оптимизации. Другими словами, этот прием не ограничен использованием только ограничений целостности. Например, предположим, что в базе данных поставщиков и деталей установлено ограничение, утверждающее, что все крас- ные детали должны храниться в Лондоне. Рассмотрим следующий запрос.
Определить всех поставщиков только красных деталей, которые (поставщики) на- ходятся в том же городе, где хранится хотя бы одна поставляемая ими деталь.
Это довольно сложный запрос! Но в силу рассмотренного ограничения целостности его можно привести к такому виду.
Определить всех поставщиков из Лондона, поставляющих только красные детали.
Замечание. Насколько известно автору, лишь немногие современные коммерческие продукты в должной мере используют идею семантической оптимизации. Однако, в принципе, семантическая оптимизация способна обеспечивать значительное улучшение производительности (весьма вероятно, намного превышающее то, которое в настоящее время может быть достигнуто с помощью любых традиционных приемов оптимизации). Более подробно идея семантической оптимизации изложена в [17.16], [17.28]—[ 17.30] и особенно — в [17.27].
Заключительные замечания
В завершение хотелось бы подчеркнуть фундаментальную важность свойства реляци- онной замкнутости в отношении всех аспектов, обсуждавшихся в этом разделе. Наличие реляционной замкнутости означает, что можно писать вложенные выражения, а это, в свою очередь, означает, что единственный запрос может быть представлен единственным выра- жением вместо некоторой процедуры, состоящей из нескольких выражений, и поэтому нет необходимости в анализе потоков. Вложенные выражения рекурсивно определяются в тер- минах подчиненных выражений, что позволяет оптимизатору использовать множество стратегий вычисления по принципу "разделяй и властвуй" (подробности приводятся ниже, в этой же главе). И конечно же, при отсутствии свойства реляционной замкнутости не име- ли бы смысла общие законы, такие как правило дистрибутивности и т.п.