- •Содержание
- •1. Основные понятия баз данных
- •1.1. Проектирование баз данных
- •1.2. Индексы и ключи в базах данных
- •2. Функциональные зависимости
- •2.1. Понятие функциональной зависимости
- •2.2. Метод синтеза
- •2.3. Аксиомы вывода
- •2.4. Применение аксиом вывода
- •2.5. Замыкание множества атрибутов относительно множества функциональных зависимостей
- •2.6. Эквивалентность двух систем функциональных зависимостей
- •2.7 Метод синтеза
- •2.8. Классы эквивалентности функциональных зависимостей с эквивалентными левыми частями
- •2.9. Составные функциональные зависимости и кольцевые покрытия
- •3. Нормализация баз данных
- •3.1. Декомпозиция таблицы на две таблицы без потери информации и с потерей информации
- •4. Иерархия в базах данных
- •4.1. Использование иерархии в базах данных
- •4.2. Инклюзивная и эксклюзивная иерархии
- •5. Сортировка и поиск записей в базах данных
- •5.1.Многофазная сортировка
- •7. Оптимизация запросов
- •7.1. Основные операции реляционной алгебры и их обозначения
- •8. Статистические данные, используемые для минимизации запросов
- •8.1. Анализ стоимости операций
- •8.2. Оценка размеров промежуточных отношений
- •8.2.1. Оценка размера результата операции объединения
- •8.2.2. Оценка размера результата операции пересечения
- •8.2.3. Оценка размера результата оператора проекции
- •8.2.4. Оценка размера результата оператора выбора
- •8.3. Выборка с условием равенства двух атрибутов
- •8.4. Выборка при условии неравенства двух атрибутов
- •8.5. Естественное соединение отношений с несколькими общими атрибутами
- •8.6. Соединение нескольких отношений
- •8.7. Оценка размеров результатов выполнения других операторов
- •8.7.1. Объединение
- •8.7.2. Пересечение
- •8.7.3. Разность
- •8.7.4. Удаление кортежей-дубликатов
- •8.7.5. Группирование и агрегирование
- •8.8. Свод формул для сравнительного расчета количества записей результата выполнения операций реляционной алгебры
- •8.9. Тождественные преобразования для операций реляционной алгебры
- •8.10. Алгебраические законы и планы запросов
- •8.10.1. Коммутативный и ассоциативный законы
- •8.11. Законы для "множественных" и "мультимножественных" версий операторов
- •8.11.1. Законы выбора
- •8.11.2. Некоторые тривиальные законы
- •8.11.3. Законы проекции
- •8.11.4. Законы соединения и декартова произведения
- •8.11.5. Законы, касающиеся удаления кортежей-дубликатов
- •8.11.6. Законы группирования и агрегирования
- •8.11.7. Закон деления
8.11. Законы для "множественных" и "мультимножественных" версий операторов
Пытаясь применять законы, справедливые для множеств, к отношениям-мультимножествам, следует быть особо внимательным. Приведем пример. Вам, возможно, известен так называемый дистрибутивный закон (distributive law) пересечения множеств, формально записываемый как .Этот закон выполняется только для множеств, но не для мультимножеств. Предположим, что каждое из мультимножеств А, В и С равно {x}. Тогда {х, х) = {х}. Но ={х, х) - это, разумеется, отнюдь не то же самое, что результат вычисления левой части выражения, {х}.
8.11.1. Законы выбора
Порядок выполнения операций выбора (selection) весьма значим с точки зрения оптимизации запросов. Поскольку при осуществлении выбора кортежей размеры отношений способны существенным образом уменьшаться, одно из важнейших правил повышения эффективности обработки запросов состоит в смещении операторов выбора вниз по дереву выражений настолько "глубоко", насколько это возможно без изменения семантики выражения в целом. В ранних версиях оптимизаторов запросов варианты подобных преобразований использовались в качестве основной стратегии поиска наилучших логических планов. Как будет показано ниже, трансформации вида "продвинуть операторы выбора вниз по дереву", однако, не вполне универсальны, но сама идея "перемещения операторов выбора" остается плодотворной.
В этом разделе мы рассмотрим алгебраические законы, касающиеся оператора σ. Для начала отметим полезность разбиения громоздких условий выбора, включающих логические операторы and или or, на составные части. Доводы в пользу подобной стратегии таковы: оператор выбора с более простым условием, охватывающим меньшее количество атрибутов, может быть перемещен в такое место дерева, куда исходный оператор со сложным условием продвинуть просто нельзя. Вот как выглядят законы расщепления (splitting rules) условий оператора выбора:
.
.
Второй закон, регламентирующий расщепление условия с оператором OR, выполняется только в том случае, если отношение R является множеством. Если бы R оказалось мультимножеством, оператор объединения множеств осуществил бы некорректные действия по удалению дубликатов.
Заметьте, что порядок задания частных условий С1 и С2 несуществен. Правую часть первого из законов расщепления, например, вполне правомочно записать так: .
Если говорить в более общем смысле, допустимо задавать любой порядок перечисления операторов выбора:
= .
Пример. Рассмотрим отношение R(a,b,c).
Оператор σ(a=1 or a=3) and b<c(R) на основании первого закона расщепления можно преобразовать к виду σa=1 or a=3(σb<c(R). Далее, применив закон расщепления условий выбора, содержащих оператор or, получим σa=1(σb<c(R)) σa=3(σb<c(R)).B данной ситуации кортеж не может единовременно удовлетворять условиям а = 1 и а = 3, и поэтому преобразование справедливо независимо от того, является R множеством или мультимножеством и используется ли для объединения оператор . В общем же случае при расщеплении условий выбора, содержащих or, требуется, чтобы к аргументу-множеству применялся оператор .
С другой стороны, можно начать преобразование, сделав σb<с внешним оператором: σb<c(σa=1 or a=3(R)). Выполнив расщепление условия, содержащего OR, получим равноценное, но несколько иное выражение:
σb<c(σa=1(R) σa=3(R)).
Теперь рассмотрим семейство законов, регламентирующих порядок преобразования операторов выбора, операндами которых служат бинарные операторы декартова произведения (Cartesian product), объединения (union), пересечения (intersection), разности (difference) и соединения (join). Законы подразделяются на три типа в зависимости от того, обязательно ли следует применять оператор выбора к одному или обоим аргументам "вложенного" бинарного оператора.
1. Для объединения — оператор выбора должен применяться к обоим аргументам.
2. Для разности — оператор следует применять к первому и (необязательно) ко второму аргументам.
3. Для остальных операторов — требуется, чтобы оператор выбора был применен по меньшей мере к одному аргументу. Что касается соединения и декартова произведения, применение оператора к обоим аргументам может оказаться либо возможным, либо нет, поскольку не исключено, что то или иное отношение-аргумент не обладает атрибутами, оговоренными в условии выбора. Если применение оператора выбора к обоим аргументам и допустимо, улучшение качества плана запроса в результате принятия подобного решения не гарантируется.
Закон, связывающий операторы выбора и объединения, выглядит так:
σC(R S)= σC(R) σC(S).
В данном случае оператор выбора продвигается "вниз" по обеим ветвям дерева.
Oдин из вариантов закона для оператора разности:
σC(R\S)= σC(R)\S.
Возможно, однако, применить оператор выбора и к обоим аргументам разности одновременно:
σC(R\S)= σC(R)\ σC(S).
Другие бинарные операторы позволяют применять оператор выбора к одному или обоим аргументам. Аргументом оператора выбора σC может быть только такое отношение, которое содержит все атрибуты, упомянутые в условии С. В приведенных ниже законах подразумевается, что отношение R обладает всеми атрибутами, присутствующими в условии С:
σC(R×S)= σC(R) ×S.
σC(R S)= σC(R) S.
σC(R S)= σC(R) S.
σC(R S)= σC(R) S.
Если в условии С упоминаются только атрибуты S, можно, напротив, воспользоваться соотношением
σC(R×S)= R×σC(S).
и подобными ему зависимостями, соответствующими операторам , и . Если всеми атрибутами из С обладают оба отношения, R и S, становится справедливым закон вида
σC(R S)= σC(R) σC(S).
Заметим, что такой закон невыполним для операций × и , поскольку схема итогового отношения R × S (или R S) представляет собой объединение схем отношений R и S и все их атрибуты строго различаются. С другой стороны, аналогичный закон для оператора имеет место, если схемы R и S совпадают.
Пример. Рассмотрим отношения R(a, b), S(b, с) и выражение
σ(a=1 or a=3) and b<c(R S).
Условие b < с может быть применено только к данным отношения S, а a=1 or а = 3 — только к кортежам R. Поэтому уместно начать с расщепления условия с оператором AND:
σa=1 or a=3(σ b<c(R S)).
Далее, продвигая оператор σb<с "внутрь" R S с применением к отношению S, получим:
σa=1 or a=3(R σ b<c(S)).
Наконец, применим "внешний" оператор σ к аргументу R:
σa=1 or a=3(R) σ b<c(S)).
Можно было бы также расщепить условие с оператором or, как показано в предыдущем примере, но получение каких-либо преимуществ, обусловленных подобным решением, заранее гарантировать нельзя.