
- •Оптимизация sql-запросов
- •Последовательность оптимизации запросов и используемые законы реляционной алгебры
- •Основные шаги оптимизации
- •Законы реляционной алгебры
- •Построение логического плана
- •Преобразование запроса в формулу реляционной алгебры
- •Оптимизация формулы реляционной алгебры
- •Иллюстрация логической оптимизации
- •Пример построения логического плана
- •Оптимизация запроса
- •Порядок выполнения запроса на логическом уровне
- •Построение физического плана
- •Шаги построения физического плана
- •Отличие физического плана от логического
- •Методы выбора записей из исходной таблицы
- •1. Чтение всех записей таблицы и их фильтрация.
- •2. Чтение записей с помощью индекса и их фильтрация.
- •Оценка числа кортежей в промежуточной таблице q
- •Оценка числа блоков в промежуточной таблице q
- •Порядок соединения таблиц
- •Левостороннее дерево соединений
- •Кустовое дерево соединений
- •Правостороннее дерево соединений
- •Методы соединения таблиц
- •Метод вложенных циклов (nlj – Nested Loop Join)
- •Метод сортировки-слияния (smj – Sort Merge Join)
- •Метод хешированного соединения (hj – Hash Join)
- •Число кортежей, блоков и мощности атрибутов в соединении
- •Поиск физического плана с минимальной стоимостью
- •Алгоритм поиска для левостороннего дерева соединений
- •Формат экземпляра структуры данных
- •Спецификации процедуры AccessPlan
- •Спецификации процедуры JoinPlan
- •Спецификации процедуры OptPlanReturn
- •Пример построения оптимального физического плана
- •Логический план
- •Алгоритм поиска оптимального физического плана
- •Определение метода выбора записей из исходной таблицы r1
- •Определение метода выбора записей из исходной таблицы r2
- •Оценка соединения q1 и q2 методом nlj
- •Оценка соединения q1 и q2 методом smj
- •Выбор метода соединения q1 и q2 и заполнение структуры
- •Оценка и выбор метода соединения q2 и q1
- •Вывод физического плана
Число кортежей, блоков и мощности атрибутов в соединении
Приведенные ниже формулы являются общими для всех рассмотренных выше методов (NLJ, SMJ и HJ).
1. Число кортежей в соединении.
(5.10)
2. Число блоков.
3. Мощности атрибутов:
а) мощность атрибута соединения ("а") в результирующей таблице
;
б) мощности остальных атрибутов (b)
Здесь T(Q1), T(Q2) – число кортежей в таблицах Q1 и Q2;
- оценка числа
кортежей в таблице, полученной после
соединения;
I(Qi,a) – мощность атрибута "а" в таблице Qi (i=1,2);
LJOIN – число кортежей соединения в одном блоке.
Поясним
1-ую формулу из 3-х, приведённых выше.
Пусть
.
В этом случае каждая запись из
соединяется в среднем с
записями
из
(считается, что если
,
то значение атрибута связи в записи из
таблицы
совпадёт со значением соответствующего
атрибута какой-либо записи из
).
Поиск физического плана с минимальной стоимостью
Для поиска оптимального физического плана используется один из алгоритмов динамического программирования.
Алгоритм поиска для левостороннего дерева соединений
Вход: логический план выполнения SQL-запроса с таблицами R1, …, Rn (см. раздел 1.2).
Выход: квазиоптимальный физический план выполнения запроса.
//Алгоритм динамического программирования
ДЛЯ i=1,n
AccessPlan(Ri)
//определение
КОНЕЦ ДЛЯ
ДЛЯ i=2,n
ДЛЯ всех подмножеств
таких, что |P|=i
// |P| - количество таблиц в P
ДЛЯ всех таблиц
// определение
метода соединения
,
дерево
// соединения таблиц (P – Qj) уже создано при выполнении
// предыдущих циклов
JoinPlan(P – Qj,Qj)
КОНЕЦ ДЛЯ
КОНЕЦ ДЛЯ
КОНЕЦ ДЛЯ
OptPlanReturn({Q1, …, Qn}) //вывод оптимального плана
//Конец алгоритма
Формат экземпляра структуры данных
Алгоритм работает с массивом структур. Экземпляр структуры имеет следующий формат:
1. W – множество имен таблиц {Qi} таких, что W=XY, если |W| > 1, и W – имя таблицы Qi , если |W| = 1.
2. X – подмножество исходных таблиц {Qi}, которые использованы для получения левого аргумента соединения X Y.
3. Y – имя таблицы Qi, которая используется в качестве правого аргумента соединения X Y.
Примечание. Если W содержит имя только одной таблицы, т.е. |W| = 1, то X и Y – пустые поля.
4. Z – текущая стоимость выполнения плана, включающая стоимости выполнения подзапросов и промежуточных соединений, а также стоимость соединения X Y, если |W| > 1, или стоимость выполнения подзапроса, если |W| = 1.
5. ZIO – составляющая ввода-вывода в Z (CI/O).
6. V – опции:
1) T(W) – прогнозируемое число кортежей (записей) в таблице W (т.е. T(X Y), если |W| > 1, или T(Qi), если |W| = 1);
2) B(W) – прогнозируемое число блоков в W;
3) {I(W, Ai)}i – мощности атрибутов в W, по которым было выполнено или будет выполняться соединение;
4) к – идентификатор метода выбора записей из исходной таблицы (если |W| = 1) или метода соединения таблиц (если |W| > 1).
Спецификации процедуры AccessPlan
Вход: Ri – имя исходной таблицы.
Выход: заполненный экземпляр структуры str[i].
Алгоритм.
// оценка стоимости выбора записей из Ri для различных методов:
// j=1 – чтение всей таблицы, j=2 – использование индекса.
ДЛЯ j=1,2
Cj = CCPUj + CI/Oj
// CCPUj и CI/Oj вычисляются с помощью формул (5.4) (для j=1)
// или с помощью формул (5.5) и (5.6) (для j=2).
КОНЕЦ ДЛЯ
// определение оптимального метода выбора записей из таблицы Ri,
// т.е. k{1,2}, заполнение экземпляра структуры str[i] (см. п. 1.7.2)
C=min (C1, C2) // здесь С=Сk
str[i] = {
{Qi}, Ø, Ø, // W, X, Y
C, CI/O k, // Z, ZIO
{T(Qi), B(Qi), {min{T(Qi), I(Ri, Aj)}j, k} // V
// для заполнения полей T(Qi), B(Qi) используются формулы
// пунктов 1.4.4 и 1.4.5
}
Конец алгоритма.