- •Содержание
- •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.2. Оценка размеров промежуточных отношений
Физический план выбирается таким образом, чтобы свести к минимуму примерную стоимость выполнения запроса. Независимо от метода выполнения плана и способов подсчета его стоимости, на значение стоимости большое влияние оказывают размеры промежуточных отношений, получаемых в процессе обработки операторов плана. В идеале было бы неплохо иметь правила предсказания количества кортежей в промежуточных отношениях,
1) дающие точные оценки;
2) простые в использовании;
3) логически непротиворечивые (в частности, оценка размера промежуточного отношения не должна зависеть от способа его получения: например, прогнозируемое значение объема отношения, получаемого в результате соединения нескольких операндов, не должно определяться порядком обработки этих операндов).
Универсального способа, который позволил бы удовлетворить все три условия, не существует. Мы, тем не менее, предложим вашему вниманию несколько простых правил, приемлемых в большинстве ситуаций. К счастью, целью прогнозирования размеров отношений не является получение сколько-нибудь точных абсолютных оценок — задача сводится к тому, чтобы просто облегчить выбор физического плана запроса. Неточный метод предсказания может восприниматься как вполне терпимый, если он ставит в соответствие наименьшее значение стоимости наилучшему физическому плану, - даже в том случае, когда само это значение расходится с реальным, получаемым в результате выполнения плана.
8.2.1. Оценка размера результата операции объединения
Рассмотрим первый вариант операции объединения
.
Рис. 8.1 - Операция объединения
.
В общем случае
.
Второй вариант операции объединения
.
Рис. 8.2 - Операция объединения
.
8.2.2. Оценка размера результата операции пересечения
.
8.2.3. Оценка размера результата оператора проекции
Оператор проекции (projection) π в контексте обсуждаемой темы отличается от других операторов тем, что объем результата его выполнения может быть вычислен точно. Поскольку в итоговое отношение проекции включается каждый кортеж отношения-аргумента, изменение объема данных обусловлено только трансформацией структуры кортежа. Напомним, что оператор проекции относится, вообще говоря, к категории "мультимножественных" операторов и сам по себе не обеспечивает удаление повторяющихся кортежей; если после проецирования необходимо избавиться от дубликатов, следует прибегнуть к услугам оператора δ, предназначенного именно для такой цели.
Обычно оператор проекции предполагает сокращение длины кортежей за счет изъятия компонентов отдельных атрибутов. Однако оператор расширенной проекции (extended projection), напротив, позволяет формировать новые компоненты на основе существующих, так что в определенных ситуациях размер итогового отношения не только не уменьшается в сравнении с исходным, но даже возрастает.
Пример. Обратимся к отношению R(a, b, с), атрибуты а и b которого относятся к целочисленному четырехбайтовому типу, а компоненты атрибута с являются строками длиной в 100 байт. Допустим, что под заголовок кортежа R отводится 12 байт. Тогда для хранения каждого кортежа потребуются 120 байт. Предположим также, что объем блока составляет 1024 байт, причем длина заголовка блока равна 24 байт. Таким образом, в один блок способны уместиться 8 кортежей. Будем считать, что T(R)= 10000, т.е. R содержит 10000 кортежей. Тогда B(R) = 1250.
Рассмотрим оператор S = πa+b,c(R), предусматривающий замену компонентов а и b каждого кортежа R их суммой. Длина кортежа S составляет 116 байт: 12 для заголовка, 4 для суммы и 100 для строки. Хотя кортежи S несколько короче кортежей R, в один блок можно уместить по-прежнему только 8 кортежей, так что T(S)= 10000 и B(S)=1250.
Теперь воспользуемся оператором U = πа,b (R), который предполагает изъятие строкового компонента с. Длина кортежа U равна всего 20 байт, a T(U) = 10000. Сейчас в один блок удается упаковать уже 50 кортежей, поэтому B(U) = 200, и в результате секции объем исходного отношения уменьшится в шесть с небольшим раз.