- •Содержание
- •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.2. Некоторые тривиальные законы
Разумеется, мы не собираемся подтверждать или опровергать справедливость каждого закона реляционной алгебры. Тем не менее читатель должен быть осведомлен, в частности, о действии законов в некоторых "экстремальных" случаях: примерами могут служить применение оператора к пустому множеству, использование операторов выбора или тета-соединения с условием, которое всегда истинно или всегда ложно, или проекция отношения на список всех атрибутов. Вот несколько из многих возможных вариантов законов для частных случаев:
результат операции выбора из пустого отношения является пустым отношением;
если некоторое условие С справедливо всегда (скажем, x>10 or x≤10 для отношения, где x is not null), тогда σC(R) = R;
если R = , то R S = S.
8.11.3. Законы проекции
Операторы проекции (projection), как и операторы выбора, допускают возможность "продвижения" вниз по дереву выражений. Продвижение операторов проекции, однако, отличается от перемещения операторов выбора тем, что зачастую первые остаются на месте, а где-либо "ниже" в дереве создаются вершины, отвечающие новым операторам проекции.
Техника продвижения операторов проекции довольно полезна, хотя и не в такой степени, как перемещение операторов выбора. Причина очевидна: применение операторов выбора часто приводит к многократному снижению количества кортежей отношения, но оператор проекции, не влияя на число кортежей, только уменьшает их длину. Более того, при использовании оператора расширенной проекции (extended projection) длина кортежей на самом деле способна даже возрасти.
Для описания алгебраических законов расширенной проекции нам понадобятся некоторые новые термины. Рассмотрим элемент E x списка проекции, где E представляет собой атрибут или выражение, состоящее из атрибутов и констант. Все атрибуты, упомянутые в составе Е, мы будем называть входными (input), а атрибут x — выходным (output). Если элемент списка является отдельным атрибутом, такой атрибут будет одновременно входным и выходным. Заметим, что иные формы выражений без стрелки и переименования, отличные от представления отдельного атрибута, недопустимы — это позволяет охватить все возможные случаи.
Если список проекции состоит только из отдельных атрибутов и не включает элементы со стрелками и иные выражения, такую проекцию мы будем называть простой (simple). Все операторы проекции, рассматриваемые в рамках классической реляционной алгебры, являются простыми.
Пример. Оператор проекции πа,b,c(R) относится к категории простых — атрибуты а, b и с являются одновременно входными и выходными. С другой стороны, оператор πа+b x,c(R) нельзя считать простым; а, b и с служат входными , а x и с — выходными атрибутами.
Основной принцип, лежащий в основе законов проекции, таков:
оператор проекции можно размещать в любом месте дерева, если он удаляет только такие атрибуты, которые не используются ни в одном из операторов, расположенных "выше" по дереву, и не присутствуют в отношении, служащем итогом вычисления выражения в целом.
В большинстве основных форм законов проекции операторы проекции трактуются как простые, хотя в некоторых случаях (например, в используемых ниже операторах со списком L) это условие выполняется не всегда.
πL(R S)= πL(πM(R) πN(S)), где М— список всех атрибутов R, которые являются либо общими атрибутами R и S, либо входными атрибутами L, а N — список атрибутов S, принадлежащих либо к числу общих атрибутов R и S, либо к категории входных атрибутов L.
πL(R S)= πL(πM(R) πN(S)), где М— список всех атрибутов R, которые являются либо атрибутами тета-соединения R и S, упомянутыми в условии С, либо входными атрибутами L, а N — список атрибутов S, принадлежащих либо к числу атрибутов тета-соединения R и S, либо к категории входных атрибутов L.
πL(R×S)= πL(πM(R)×πN(S)), где М и N — списки всех атрибутов R и S соответственно, являющихся входными атрибутами L.
Пример. Рассмотрим отношения R(a, b, с), S(c, d, e) и выражение πa+e x, b y(R S). Входные атрибуты проекции — а, b и e, а с — единственный общий атрибут соединяемых отношений R и S. На основании соответствующего закона имеем право применить к отношениям R и S (аргументам соединения) операторы проекции со списками, учитывающими номенклатуру атрибутов R и S:
πa+e x, b y(πa,b,c(R) πc,e(S)).
Заметьте, что оператор πa,b,c(R) тривиален — он выполняет проекцию на все атрибуты отношения R. Удаление этого оператора приводит к третьей эквивалентной форме выражения, πa+e x, b y(R πc,e(S)), которая отличается от исходной тем, что предполагает удаление атрибута d отношения S непосредственно перед выполнением соединения.
Помимо того, допустимо заменять проекцию "мультимножественной" версии объединения отношений объединением отношений-проекций:
πL(R S)=πL(R) πL(S).
Аналогичные преобразования операций объединения множеств, а также пересечения и разности (в версиях для множеств и мультимножеств), напротив, применять нельзя.
Пример. Допустим, что отношение R(a,b) содержит единственный кортеж {(1,2)}, а отношение S(a, b) — единственный кортеж {(1,3)}. Тогда
πa(R S)= πa( )= . Однако
πa(R) πa(S)={(1)} {(1)}= {(1)}.
Если проецирование сопряжено с выполнением определенных вычислений и входные атрибуты некоторого элемента списка проекции целиком принадлежат одному из аргументов оператора соединения (или декартова произведения), служащего операндом проекции, есть возможность (но не обязанность) осуществить вычисления непосредственно над аргументом. Проиллюстрируем сказанное примером.
Пример. Вновь обратимся к отношениям R(a,b,c), S(c,d,e) и рассмотрим следующую операцию проекции, применяемую к результату соединения:
πa+b x, d+c (R S).
Допустимо применить операции суммирования а + b и переименования суммы в x непосредственно к отношению R, а аналогичные операции получения суммы d + e и ее переименования в у — к отношению S. Эквивалентное выражение примет вид
πx,y(πa+b x,c(R) πd+e y,c(S)).
Один из заслуживающих внимания частных случаев связан с совпадением с с х или у. В подобной ситуации переименовать сумму в с нельзя, поскольку отношение не может иметь два атрибута с именем с. Поэтому следует воспользоваться новым временным именем и выполнить соответствующее переименование в условии "внешнего" оператора проекции. Например, выражение πa+b c,d+e y(R S) в преобразованном виде можно было бы записать как πz c,y(πa+b z,c(R) πd+e y,c(S)).
Допустимо также применение нового оператора проекции к аргументу "внутреннего" оператора выбора.
πL(σC(R))= πL(σC(πM(R))),
где М— список всех атрибутов, которые либо являются входными атрибутами из списка L, либо упоминаются в условии С.
Как и в примере, имеется возможность выполнения вычислений над списком М вместо L — при условии, что в С не упоминаются входные атрибуты из L, вовлеченные в процесс вычислений.
Зачастую целесообразно продвигать операторы проекции вниз по дереву выражений — даже если при этом исходный оператор проекции остается на месте, поскольку при проецировании удается уменьшить размеры кортежей и, таким образом, сократить количество дисковых блоков, занимаемых промежуточным отношением. Впрочем, подобные действия нельзя выполнять безоглядно, так как в определенных ситуациях перенос операторов проекции вниз по дереву выражений сопряжен с дополнительными временными затратами.
Пример. Рассмотрим запрос, обращаемый к отношению
StarsIn (movieTitle, movieYear, starName) и предполагающий отыскание сведений об актерах, которые снимались в фильмах, вышедших на экраны в 1996 году:
SELECT starName
FROM StarsIn
WHERE movieYear = 1996;
Результат прямой трансляции запроса в логический план показан на рис. 23.
Перед выполнением операции выбора можно осуществить операцию проекции на следующие атрибуты:
1) starName — требуемый для включения в схему итогового отношения;
2) movieYear — необходимый для условия выбора.
Если бы отношение starsln было не хранимой таблицей, а результатом другой операции, такой как соединение, план, представленный на рисунке 8.11, имел бы очевидный смысл: нам удалось бы передавать результат проекции по "каналу" (pipeline) по мере генерирования кортежей в процессе соединения, опуская "лишний" атрибут movieTitle. Однако starsin является хранимым отношением. Применение оператора проекции πstarName, movieYear действительности способно повлечь необоснованные затраты времени, особенно в том случае, если атрибут movieYear снабжен индексом. В физическом плане, сконструированном на основе исходного логического плана на рисунке 8.11, напротив, тот же индекс удалось бы использовать для выбора только таких кортежей starsin (их наверняка оказалось бы не много), значения компонентов movieYear которых равны 1996. Но если первой выполнять операцию проекции (как на рисунке 8.12), придется считывать (а затем проецировать) каждый кортеж starsIn. Что еще хуже, индекс, созданный для атрибута movieYear отношения starsin, окажется абсолютно бесполезным при работе с совершенно другим отношением πstarName, movieYear(StarsIn), так что для выполнения оператора выбора придется применять полномасштабное сканирование всех кортежей результата "вредоносной" проекции.
πstarName
σmovieYear= 1996
Starsin
Рис. 8.11 - Логический план запроса к примеру
πstarName
σmovieYear= 1996
πstarName, movieYear
Starsin
Рис. 8.12 - Результат добавления оператора проекции