- •Содержание
- •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.4. Оценка размера результата оператора выбора
При выполнении оператора выбора (selection) σ количество кортежей, как правило, уменьшается, но размер отдельного кортежа сохраняется. В простейшем варианте выбора, когда атрибут сравнивается с константой, оценить размер итогового отношения несложно, если имеется возможность выяснить или приближенно оценить количество различных значений сопоставляемого атрибута. Рассмотрим оператор S = σa=c(R), где а — атрибут отношения R, а с — некоторая константа. В качестве оценки рекомендуется использовать следующее соотношение:
T(S) = T(R) / V(R, a).
Оценка становится точной, если все значения атрибута а распределены с равной вероятностью. Впрочем, представленная формула все еще остается наилучшей оценкой в среднем — даже в том случае, если распределение значений а не является однородным, но все значения а одинаково часто упоминаются в запросах, в которых адресуется атрибут а. Еще более близкие к точным оценки удается получить, если СУБД поддерживает усовершенствованные функции сбора статистических характеристик и ведения гистограмм (histograms) данных.
Получение оценок размеров итоговых отношений становится более проблематичным, если критерий выбора основан на неравенстве — скажем, S= σа<l0(R). Навскидку можно было бы предположить, что в среднем одна половина значений удовлетворяет подобному условию, а другая — нет, и потому использовать в качестве оценки размера S значение T(R) /2. Однако интуиция подсказывает, что при обработке запросов, в которых в качестве условий выбора привлекаются неравенства, вообще говоря, достаточно обращаться к небольшой части всех кортежей. Поэтому мы предлагаем правило, которое согласуется с подобными эмпирическими соображениями и подразумевает, что типичный запрос с условием выбора, заданным в виде неравенства, возвращает около трети, а не половину всех кортежей исходного отношения. Таким образом, если S= σa<с(R), прогнозируемое значение T(S) выглядит как
T(S) = T(R)/3.
Случай использования условия выбора "не равно" относительно редок. Впрочем, если оператор вида S=σa≠c(R) все-таки встретится, в качестве оценки T(S) мы рекомендуем использовать соотношение T(S) = T(R), т.е. считать, будто практически все кортежи исходного отношения удовлетворяют критерию а ≠ с выбора. С другой стороны, можно было бы применить и такую оценку, как T(S) = T(R)(V(R, а)- l) / V(R, а), которая незначительно ниже величины T(R) и согласуется с эвристикой, подразумевающей, что примерно (1 / V(R, а))-я часть всех кортежей R не удовлетворяет условию, поскольку значения их компонентов а равны заданной константе с.
Если условие С выбора представляет собой конъюнкцию (and) нескольких равенств и/или неравенств, оператор σС(R) следует трактовать как цепочку "вложенных" операторов σ, каждым из которых проверяется один конъюнкт. Заметим, что порядок перечисления частных операторов выбора несуществен. Прогнозируемый размер итогового отношения в этом случае можно представить как количество кортежей в исходном отношении, умноженное на коэффициенты "избирательности" всех частных операторов — 1/3 для неравенств вида > и <, 1 для ≠ и 1/ V(R, а) для условий сравнения значений атрибута а с константой.
Пример. Рассмотрим отношение R(a,b,c) и оператор S=σa=10 and b<20(R), Допустим, что T(R)= 10000 и V(R, a) = 50. Тогда в качестве оценки T(S) можно принять величину T(R) / (50 * 3) = 67, полагая, что примерно (1/50)-я часть кортежей R удовлетворяет условию a= 10, а (1/3) -я — условию b<20.
Частный случай, опровергающий доводы в пользу применяемого нами способа прогнозирования, связан с ситуацией, когда условие внутренне противоречиво. Рассмотрим для примера оператор S=σa=10 and а<20(R). В соответствии с указанным правилом T(S) = T(R) / (3V(R, a)), т.е. отношение S должно было бы содержать примерно 67 кортежей. Однако совершенно очевидно, что кортежей, удовлетворяющих условиям а =10 и а>20 одновременно, не существует, так что в действительности T(S) = 0. Выполняя перезапись логического плана, оптимизатор запросов руководствуется, помимо всего прочего, множеством правил, отвечающих различным частным случаям. При обработке рассматриваемого здесь условия выбора добротный оптимизатор способен применить правило сведения условия к значению false и принять в качестве результата операции пустое множество.
Если критерий выбора образован на основе дизъюнкции (or) отдельных условий (скажем, S = σC1 or C2(R)), тогда ожидаемый размер итогового отношения не столь очевиден. Одно из подходящих на первый взгляд соображений состоит в том, что ни один кортеж, якобы, не удовлетворяет одновременно обоим условиям, так что размер итогового отношения можно представить как сумму количеств кортежей, отвечающих каждому из условий. Подобная оценка, как правило, оказывается завышенной и подчас способна привести к совершенно абсурдному заключению о том, будто в итоговом отношении S больше кортежей, нежели в исходном R. Другой столь же простой и несколько более корректный подход предполагает использование в качестве оценки размера результата S минимального из двух значений — размера отношения-операнда R и суммы количеств кортежей, удовлетворяющих отдельным условиям С1 и С2.
Менее тривиальную и, вероятно, более точную оценку величины S= (R) можно получить в том случае, если трактовать условия С1 и С2 как независимые. Если R содержит п кортежей, m1 из которых удовлетворяют условию С1, а т2 — условию С2, количество кортежей в S можно представить как
Внесем ясность: 1-т1/ п — это доля кортежей, не удовлетворяющих условию С1ь а (1 -т2/ п) — часть кортежей, которые не отвечают условию С2; произведение этих величин представляет часть кортежей R, которые не включаются в S, а разность единицы и произведения — ту долю кортежей R, которые, напротив, в S "попадают".
Пример. Рассмотрим отношение R(a, b) с T{R) = 10000 кортежей и оператор
S=σa=10 or b<20(R).
Пусть V(R, а) = 50. Тогда количество кортежей, удовлетворяющих условию а = 10, можно представить как T(R) / V(R, a) = 200, а число кортежей, соответствующих условию b<20, — как T(R)/3 3333. Простейшая оценка размера S выглядит как сумма двух значений, т.е. 3533. Применение более серьезного подхода, основанного на допущении, что условия а = 10 и b< 20 являются независимыми, дает
10000(l - (1 - 200/10000)(1 - 3333/10000)) = 3466.
Впрочем, в этом случае оценки различаются весьма незначительно, и маловероятно, что решение о предпочтении той или иной из них способно радикальным образом повлиять на выбор наилучшего физического плана.
Наконец, вкратце обсудим способ прогнозирования размера итогового отношения, если в условии оператора выбора присутствует логический оператор not. Ожидаемое количество кортежей отношения R, удовлетворяющих условию not С, равно T(R) за вычетом приближенного числа кортежей, отвечающих условию С.