ТОРА (9) - Лекция №11 - Оценки: различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
(Новая страница: «{{Backward|l=ТОРА (9) - Лекция №10 - Логический и физический план запроса}} == Оптимизация SQL-запрос...»)
 
 
(не показано 9 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{Backward|l=ТОРА (9) - Лекция №10 - Логический и физический план запроса}}
{{Backward|l=ТОРА (9) - Лекция №10 - Логический и физический план запроса}}
Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого [[Григорьев Ю.А. | Григорьева]] можно загрузить [http://yadi.sk/d/VjjMs6ww1HH2D здесь].
__TOC__
== Оптимизация SQL-запросов ==
== Оптимизация SQL-запросов ==


=== Оценка числа кортежей в промежуточной таблице ===
=== Физический план ===
 
==== Методы выбора записей из исходной таблицы ====
 
===== Оценка числа кортежей в промежуточной таблице =====


В таблице {{Формула|f=Q}}. Вычисляется по формуле:
В таблице {{Формула|f=Q}}. Вычисляется по формуле:
Строка 8: Строка 14:
{{Формула|f=Q = \Pi_A(\sigma_f(R))}}
{{Формула|f=Q = \Pi_A(\sigma_f(R))}}


{{Формула|f=T(Q) = T(R)\cdot p}} (7)
{{Формула|f=T(Q) = T(R)\cdot p}}


здесь:
здесь:
Строка 29: Строка 35:
:{{Формула|f=I(R,a)}} - мощность атрибута {{Формула|f=a}} в таблице {{Формула|f=R}}.
:{{Формула|f=I(R,a)}} - мощность атрибута {{Формула|f=a}} в таблице {{Формула|f=R}}.


==== Пример ====
====== Пример ======


Допустим, {{Формула|f=T(R) = 1000}}, {{Формула|f=I(R,a) = 5}}, {{Формула|f=I(R,b) = 10}}, {{Формула|f=I(R,c) = 2}}, где {{Формула|f=a,b,c}} - положительные натуральные числа.
Допустим, {{Формула|f=T(R) = 1000}}, {{Формула|f=I(R,a) = 5}}, {{Формула|f=I(R,b) = 10}}, {{Формула|f=I(R,c) = 2}}, где {{Формула|f=a,b,c}} - положительные натуральные числа.
Строка 46: Строка 52:


:{{Формула|f=F_1\bigcup F_2 = F_3}}
:{{Формула|f=F_1\bigcup F_2 = F_3}}
:{{Формула|f=p_3 = p_1 + p_2 - p_1\cdot p_2 = \frac{2}{5} + \frac{6}{10} - \frac{2}{5}\cdot\frac{6}{10} }}
:{{Формула|f=p_3 = p_1 + p_2 - p_1\cdot p_2 = \frac{2}{5} + \frac{6}{10} - \frac{2}{5}\cdot\frac{6}{10} = 0.76}}


2)
2)
Строка 57: Строка 63:
:{{Формула|f=T(Q) = 1000\cdot 0.38 = 380}}
:{{Формула|f=T(Q) = 1000\cdot 0.38 = 380}}


=== Оценка количества блоков ===
===== Оценка количества блоков =====


{{Формула|f=Q = \Pi_A(\sigma_f(R))}}
{{Формула|f=Q = \Pi_A(\sigma_f(R))}}
Строка 67: Строка 73:
:{{Формула|f=L_B}} - длина блока (число записей в блоке) с учётом {{Формула|f=\Pi_A}}.
:{{Формула|f=L_B}} - длина блока (число записей в блоке) с учётом {{Формула|f=\Pi_A}}.


=== Деревья соединения ===
==== Порядок соединения промежуточных таблиц ====
 
===== Деревья соединения =====


Три вида:
Используются деревья соединения, которые бывают трёх видов:
* левостороннее;
* левостороннее;
* кустовое, ветвящееся;
* кустовое, ветвящееся;
* правостороннее.
* правостороннее.


==== Левостороннее ====
====== Левостороннее ======


Предположим, соединяются таблицы {{Формула|f=R,S,T,U}}:
Предположим, соединяются таблицы {{Формула|f=R,S,T,U}}:
Строка 86: Строка 94:
* достаточно просто организивать ''каналы обработки'' - возможность передачи результата выполнения одной операции на вход другой через оперативную память (без сохранения на диск);
* достаточно просто организивать ''каналы обработки'' - возможность передачи результата выполнения одной операции на вход другой через оперативную память (без сохранения на диск);


В канале левый аргументы называется ''опорным'' и он должен храниться в оперативной памяти. Правый аргумент называется ''тестируемым'' и он может храниться и на диске. При хранении в оперативной памяти не надо читать с диска, потому всё можно выполнить за одни проход.
В канале левый аргумент называется ''опорным'' и он должен храниться в оперативной памяти. Правый аргумент называется ''тестируемым'' и он может храниться и на диске. При хранении в оперативной памяти не надо читать с диска, потому всё можно выполнить за один проход.


Недостатки:
Недостатки:
* путём перебора порядков соединения можно выбрать квазиоптимальный план (потому что на самом деле вариантов перебора больше, чем {{Формула|f=n!}}, потому что правый аргумент - всегда таблица).
* путём перебора порядков соединения можно выбрать квазиоптимальный план (потому что на самом деле вариантов перебора больше, чем {{Формула|f=n!}}, потому что правый аргумент - всегда таблица).


==== Кустовое ====
====== Кустовое ======


Тут таблицы могут соединяться в любом порядке.
Тут таблицы могут соединяться в любом порядке.
Строка 106: Строка 114:
* могут возникнуть сложности в организации канала обработки, так как возрастают требования к объёму оперативной памяти. Чтобы реализовать соединение за один проход, в памяти должно храниться слишком много таблиц.
* могут возникнуть сложности в организации канала обработки, так как возрастают требования к объёму оперативной памяти. Чтобы реализовать соединение за один проход, в памяти должно храниться слишком много таблиц.


==== Правостороннее ====
====== Правостороннее ======


При таком порядке левым аргументом каждого соединения является исходная таблица.
При таком порядке левым аргументом каждого соединения является исходная таблица.
Строка 114: Строка 122:
Такой способ практически не используется, потому что для него требуется, чтобы каждая из исходных таблиц и промежуточные результаты могли уместиться в оперативной памяти.
Такой способ практически не используется, потому что для него требуется, чтобы каждая из исходных таблиц и промежуточные результаты могли уместиться в оперативной памяти.


=== Методы соединения таблиц ===
==== Методы соединения таблиц ====


Методы реализации естественного соединения {{Формула|f=\bowtie}}.
Методы реализации естественного соединения {{Формула|f=\bowtie}}.


Три метода:
Три метода:
* ложных циклов (NLJ - Nested Loop Join);
* вложенных циклов (NLJ - Nested Loop Join);
* сортировки слияния (SMJ - Sort Merge Join);
* сортировки слияния (SMJ - Sort Merge Join);
* хэшированных соединений (Hash Join).
* хэшированных соединений (Hash Join).


==== Метод ложных циклов ====
{{Forward|l=ТОРА (9) - Лекция №12 - Оценки (продолжение)}}
 
Каждая запись первой соединяемой таблицы сравнивается с каждой записью второй соединяемой таблицы. В общем случае, условие сравнения может быть произвольным.


[[Файл:9sTORAl11pic4.png]]
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]
[[Категория:Конспекты лекций и семинаров]]

Текущая версия от 08:37, 22 января 2013

...начало

Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого Григорьева можно загрузить здесь.

Оптимизация SQL-запросов

Физический план

Методы выбора записей из исходной таблицы

Оценка числа кортежей в промежуточной таблице

В таблице $$Q$$. Вычисляется по формуле:

$$Q = \Pi_A(\sigma_f(R))$$

$$T(Q) = T(R)\cdot p$$

здесь:

$$Q$$ - промежуточная таблица;
$$T(Q)$$ - число кортежей в промежуточной таблице;
$$T(R)$$ - число записей в исходной таблице $$R$$;
$$p$$ - вероятность того, запись из таблицы $$R$$ удовлетворяет условию $$F$$.

Расчёт $$p$$:

  1. если $$f = F_1\bigcap F_2$$, то $$p = p_1\cdot p_2$$;
  2. если $$f= F_1\bigcup F_2$$, то $$p = p_1 + p_2 - p_1\cdot p_2$$;
  3. если $$f = \overline{F_1}$$, то $$p = 1 - p_1$$.

Для $$i$$-ой вероятности:

$$p_i = \frac{k}{I(R,a)}$$

здесь:

$$k$$ - мощность атрибута $$a$$ в запросе;
$$I(R,a)$$ - мощность атрибута $$a$$ в таблице $$R$$.
Пример

Допустим, $$T(R) = 1000$$, $$I(R,a) = 5$$, $$I(R,b) = 10$$, $$I(R,c) = 2$$, где $$a,b,c$$ - положительные натуральные числа.

И $$f = (a<3$$ $$OR$$ $$b\geq5)$$ $$AND$$ $$c=2$$

Найти $$T(Q)$$.

Обозначим:

  • $$a<3$$ как $$F_1$$;
  • $$b\geq 5$$ как $$F_2$$;
  • $$f = (a<3$$ $$OR$$ $$b\geq5)$$ как $$F_3$$;
  • $$c=2$$ как $$F_4$$.

1)

$$F_1\bigcup F_2 = F_3$$
$$p_3 = p_1 + p_2 - p_1\cdot p_2 = \frac{2}{5} + \frac{6}{10} - \frac{2}{5}\cdot\frac{6}{10} = 0.76$$

2)

$$f = F_3\bigcap F_4$$
$$p = p_3\cdot p_4 = 0.76\cdot\frac{1}{2} = 0.38$$ - это вероятность того, что запись из $$R$$ удовлетворяет условию $$f$$.

3)

$$T(Q) = 1000\cdot 0.38 = 380$$
Оценка количества блоков

$$Q = \Pi_A(\sigma_f(R))$$

$$B(Q) = \Bigr[\frac{T(Q)}{L_B}\Bigl]$$ - скобки обзначают, что огругление с избытком.

здесь:

$$T(Q)$$ - прогнозируемое число записей в подзапросе;
$$L_B$$ - длина блока (число записей в блоке) с учётом $$\Pi_A$$.

Порядок соединения промежуточных таблиц

Деревья соединения

Используются деревья соединения, которые бывают трёх видов:

  • левостороннее;
  • кустовое, ветвящееся;
  • правостороннее.
Левостороннее

Предположим, соединяются таблицы $$R,S,T,U$$:

В каждом соединении правым аргументом является одна из таблиц.

Преимущества:

  • число перебора вариантов меньше, чем для произвольного варианта соединения (если количество соединений $$n$$, то вариантов перебора будет $$n!$$);
  • достаточно просто организивать каналы обработки - возможность передачи результата выполнения одной операции на вход другой через оперативную память (без сохранения на диск);

В канале левый аргумент называется опорным и он должен храниться в оперативной памяти. Правый аргумент называется тестируемым и он может храниться и на диске. При хранении в оперативной памяти не надо читать с диска, потому всё можно выполнить за один проход.

Недостатки:

  • путём перебора порядков соединения можно выбрать квазиоптимальный план (потому что на самом деле вариантов перебора больше, чем $$n!$$, потому что правый аргумент - всегда таблица).
Кустовое

Тут таблицы могут соединяться в любом порядке.

Так что перебираются все возможные варианты соединения.

Преимущества:

  • всегда выбирается оптимальный план.

Недостатки:

  • если количество соединяемых таблиц велико, то перебор всех деревьев может занять много времени;
  • могут возникнуть сложности в организации канала обработки, так как возрастают требования к объёму оперативной памяти. Чтобы реализовать соединение за один проход, в памяти должно храниться слишком много таблиц.
Правостороннее

При таком порядке левым аргументом каждого соединения является исходная таблица.

Такой способ практически не используется, потому что для него требуется, чтобы каждая из исходных таблиц и промежуточные результаты могли уместиться в оперативной памяти.

Методы соединения таблиц

Методы реализации естественного соединения $$\bowtie$$.

Три метода:

  • вложенных циклов (NLJ - Nested Loop Join);
  • сортировки слияния (SMJ - Sort Merge Join);
  • хэшированных соединений (Hash Join).

продолжение...