ТОРА (9) - Лекция №15 - Пример оценки
Этот конспект ещё не дописан. Здесь не хватает: - описаний формул. А также в некоторых формулах должны быть ошибки; - графического представления оптимального плана. |
...начало

Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого Григорьева можно загрузить здесь.
Оптимизация SQL-запросов
Методы соединения таблиц
Алгоритмы для поиска физического плана
Пример оценки физического плана
Исходные данные:
1) количество записей в таблице $$T(R_1)$$ = 10000, количество записей в таблице $$T(R_2)$$ = 100000;
2) количество записей в одном блоке таблицы $$L(R_1) = L(R_2)$$ = 100, количество записей в соединении $$L_{JOIN}$$ = 1000;
3) количество записей в блоке индекса код_пользователя {{Формула|f=L} = 200, количество записей в блоке индекса номер_счёта {{Формула|f=L} = 200;
- Примечание: записи исходных таблиц могут читаться в сортированном виде по своим индексированным атрибутам. Записи в таблице $$R_1$$ сгруппированы по атрибуту код_пользователя (кластеризованный индекс), а в таблице $$R_2$$ не сгруппированы.
4) мощность атрибутов:
- $$R_1$$,
код_пользователя
5000; - $$R_1$$,
номер_счёта
10000; - $$R_2$$,
номер_счёта
100000 - $$R_2$$,
остаток
- неизвестно.
5) тут почему-то пусто
6) $$b$$ = 10, $$C_{COMP} = C_{MOVE} = C_{filter} = 0.01$$ мс, $$C_B = 10$$ мс.
Для построение оптимального физического плана используется алгоритм динамического программирования (из предыдущей лекции).
Алгоритм:
1) $$AccessPlan$$
- а) $$R_1$$ - таблица пользователи;
- $$j = 1$$, чтение всей таблицы
- $$C_1 = C_{CPU1} + C_{I/O1} = T(R_1)\cdot C_{filter} + B(R_1)\cdot C_B = 10000\cdot 0.01 + \frac{10000}{100}\cdot 10 = 1100$$ мс
- $$j = 2$$ - индекс по атрибуту
код_пользователя
- $$C_2 = C_{CPU2} + C_{I/O2} = \frac{T(R_1)\cdot K}{I(R_1, a)}\cdot C_{filter} + \frac{B(Index(a))\cdot k}{I(R_1, a)} \cdot C_b + \frac{B(R_2)\cdot k}{I(R_1, a)} =$$
- $$=\frac{10000\cdot 1}{5000}\cdot 0.01 + \frac{(10000/200)\cdot 1}{5000}\cdot 10 + \frac{10000/100\cdot 1}{5000}\cdot 10 = 0.02 + 0.3 = 0.32$$ мс
- $$С = min(С_1, С_2) = 0.32$$ мс
- $$С_{I/O} = C_{I/O2} = 0.3$$ мс
- $$T(Q_1) = T(R_2)\cdot P_{код\_ пользователя = 3} = T(R_2)\cdot \frac{k}{I(R_1, a)} = 10000 \cdot 1/5000 = 2$$
- $$B(Q_1) = \lceil\frac{T(Q_1)}{L(R_1)\cdot 10}\rceil = \lceil\frac{2}{100\cdot 10}\rceil = 1$$
- $$str[1] = \{\{Q_1\}, \varnothing, \varnothing, 0.32, 0.3, \{2, 1, \{2\}, 2\}\}$$
- б) $$R_2$$ - таблица счёт.
- $$j = 1$$
- $$C_1 = 100000\cdot 0.01 + \frac{100000}{100}\cdot 10 = 11000$$ мс
- $$j = 2$$
- $$C = C_1 = 11000$$ мс
- $$C_{I/O} = C_{I/O1} = 10000$$ мс
- $$T(Q_2) = T(R_2)\cdot P_{R_2.остаток > 1500} = 100000\cdot 1/3 = 33000$$, вероятность принята равной $$1/3$$, так как по условию эта мощность неизвестна
- $$B(Q_2) = \lceil\frac{T(Q_2)}{L(R_2)\cdot 10}\rceil = \lceil\frac{33000}{100\cdot 10}\rceil = 33$$
- $$str[2] = \{\{Q_2\}, \varnothing, \varnothing, 11000, 10000, \{33000, 33, \{33000\}, 1\}\}$$
2) $$JoinPlan$$
- $$m_1 = 1$$, $$m_2 = 2$$ - номера экземпляров структур, таких, что $$str[m_1].W = Q_1$$ и $$str[m_2].W = Q_2$$
- а)
- $$i = 1$$, NLJ
- $$C_1 = C_{CPU1} + C_{I/O1} = T(Q_1)\cdot T(Q_2)\cdot C_{COMP} + \lfloor\frac{B(Q_1)}{b}\rfloor\cdot C_{I/O}(Q_2) = 2\cdot 33000\cdot 0.01 + \lfloor\frac{1}{10}\rfloor\cdot 10000 = 660$$ мс
- $$i = 2$$, SMJ
- таблица $$Q_2$$ уже отсортирована по номер_счёта, так как имеется индекс по номеру счёта
- $$С_2 = С_{CPU2} + C_{I/O2} = C^{SORT}_{CPU}(Q_1) + С^{JOIN}_{CPU}(Q_1, Q_2) + C^{SORT}_{I/O}(Q_1) + C^{JOIN}_{I/O}(Q_1, Q_2) =$$
- $$= 2\cdot \log_2\frac{2}{\lfloor 1/10\rfloor}\cdot (0.01 + 0.01) + (\log_{10}1 - 1)\cdot 2\cdot (10\cdot 0.01 + 0.01) + ((\frac{33000}{33000} + 2\cdot 2 +$$
- $$+ 33000\cdot(1 - \frac{2}{33000}))\cdot 0.01 + (2\cdot 1\cdot \log_{10}\cdot 1)\cdot 10 + (1 + 0)\cdot 10 = 340$$ мс
- $$C = min(C_1, C_2) = 340$$
- $$C = str[1].Z + str[2].Z + C = 0.32 + 11000 + 340 = 11340.32$$ мс
- $$C_{I/O} = str[1].ZIO + str[2].ZIO + C_{I/O2} = 0.3 + 10000 + 10 = 10010.3$$ мс
- $$T(Q_1\bowtie Q_2) = \frac{T(Q_1)\cdot T(Q_2)}{max(I(Q_1, a), I(Q_2, a))} = \frac{2\cdot 33000}{max(2, 33000)} =2$$
- $$B(Q_1\bowtie Q_2) = \lceil\frac{2}{1000}\rceil= 1$$
- $$I(Q_1\bowtie Q_2, a) = min(I(Q_1, a), I(Q_2, a)) = min(2, 33000) = 2$$
- $$str[3] = \{\{Q_1, Q_2\}, \{Q_1\}, \{Q_2\}, 11340, 10010, \{2, 1, \{2\}, 2\}\}$$
- б)
- структура остаётся такая же
3) $$OptPlanReturn$$ - вывод оптимального плана и представление этого плана в графическом виде.
- 1) $$(Q_1, Q_2) = Q_1\bowtie Q_2$$
- 2) $$Q_1 = (IndexScan() + Filter())$$
- 3) $$Q_2 = (TableScan() + Filter())$$