Программирование >>  Полное сканирование таблицы 

1 ... 96 97 98 [ 99 ] 100 101 102 ... 107


(по крайней мере, в этом запросе) использовать индексы по внешним ключам для ВЗ и А2 и индексы по первичным ключам для С2, D2, D1 и D3.

Решение для задачи из главы 7

Глава 7 включает одну достаточно сложную задачу, позволяющую использовать большинство правил для подзапросов. В этом разделе вы найдете детальное пошаговое решение этой задачи. На рис. А.9 показаны отсутствующие коэффициенты для трех полусоединений и антисоединения.

0205 \1O0.99 20.0.1/

D.025

D103 S3 0005 0.8,0.2. S1 0.5 S2 0.9

D4 0.001


А102 Т

В10.8

А20.7

S4 S5 S6 01 S7 0.7

Рис. А.9, Диаграмма с рис. 7.36 с указанными отсутствующими коэффициентами подзапросов

Я начну с объяснения вычислений отсутствующих коэффициентов, показанных на рис. А.9. Чтобы найти корреляционный коэффициент предпочтения для полусоединения с D1, просто выполните правила, перечисленные в главе 7, в разделе Диаграммное изображение подзапросов EXISTS . На первом шаге мы находим, что детальный коэффициент соединения для D1, исходя из рис. 7.36, равен D = 0,8. Это редкий случай соединения многие к одному , когда одной главной строке соответствует в среднем менее одной детализированной строки. Предположим, что М = 1. Это обычное значение главного коэффициента соединения для случая, когда он явно не показан на диаграмме. Лучший коэффициент фильтрации среди узлов в этом подзапросе (D1, S1 и S2) равен 0,3 для D1, поэтому S = 0,3. Лучший коэффициент фильтрации срезу узлов внешнего запроса (М, А1, А2, В1 и В2) равен 0,2 для А1, поэтому R = 0,2. На втором шаге правила находим D х S = 0,24, а М x R = 0,2, поэтому D х S > М х R. Следовательно, нужно перейти к шагу 3. Мы находим, что S > R, поэтому корреляционный коэффициент предпочтения равен S/R = 1,5; записываем его рядом с указателем полусоединения Е от И к D1.

Чтобы найти корреляционный коэффициент предпочтения для полусоединения с D2, повторяем процесс. На первом шаге находим детальный коэффициент соединения на рис. 7.36 (D = 10). Предполагаем, что М = 1, обычный главный коэффициент соединения, когда он явно не указан на диаграмме. Лучший коэффициент фильтрации между D2 и S3 равен 0,0005 для S3, поэтому S = 0,0005. Лучший



коэффициент фильтрации среди узлов внешнего запроса, как и раньше, равен R = 0,2. На втором шаге правил находим D х S = 0,005, а М х К - 0,2, поэтому D х S < М х R. Следовательно, вычисления завершаются на шаге 2, и корреляционный коэффициент предпочтения равен (D х S)/(M х К) = 0,025; записываем его рядом с указателем полусоединения Е от М к D2.

Чтобы найти корреляционный коэффициент предпочтения для полусоединения с D4, повторим процесс. На первом шаге находим детальный коэффициент соединения на рис. 7.36 (D = 2). Предполагаем, что М - 1, обычный главный коэффициент соединения, когда он явно не указан на диаграмме. Лучший коэффициент фильтрации среди D4, S4, S5, S6 и S7 равен 0,001 для D4, поэтому S = 0,001. Лучший коэффициент фильтрации среди узлов внешнего запроса, как и раньше, равен R = 0,2. На втором шаге находим D х S = 0,002, а М х К = 0,2, поэтому D х S < М х R. Следовательно, вычисления завершаются на шаге 2, и корреляционный коэффициент предпочтения равен (D х S)/(M х R) = 0,01; записываем его рядом с указателем полусоединения Е от И к D4.

Теперь перейдем к следующему набору правил, чтобы найти уточненные коэффициенты фильтрации подзапросов. Шаг 1 указывает, что нам не нужен уточненный коэффициент фильтрации для D4, так как его корреляционный коэффициент предпочтения меньше 1,0 и меньше всех остальных коэффициентов предпочтения. Перейдем к шагу 2 для D1 (корреляционный коэффициент предпочтения которого больше 1,0) и D2 (коэффициент предпочтения которого больше того же коэффициента для D4). В подзапросах под узлами D1 и D2 есть фильтры, поэтому для каждого из них перейдем к шагу 3. Для D1 найдем D = 0,8 и s - 0,3, то есть значение S равно самому коэффициенту фильтрации для D1. На шаге 4 заметим, что D < 1, поэтому уточненный коэффициент фильтрации подзапроса равен s х D = 0,24, и мы записываем его рядом с числом 0,8 у верхнего конца полусоединения с D1.

На шаге 3 для D2 находим, что D = 10 и s = 0,5, то есть значение s равно самому коэффициенту фильтрации для D2. На шаге 4 замечаем, что D > 1, поэтому переходим к шагу 5. Обратите внимание, что s х D = 5, что больше 1,0, поэтому переходим к шагу 6. Пусть уточненный коэффициент фильтрации подзапроса равен 0,99, и запишем это число рядом с числом 10 у верхнего конца полусоединения с D2.

Теперь единственный отсутствующий коэффициент - это уточненный коэффициент фильтрации подзапроса для антисоединения с D3. Следуя правилам для антисоединений, на шаге 1 находим, что t = 5 и q = 50 для рассматриваемого оператора. На шаге 2 замечаем, что в этом подзапросе есть лишь один узел (как это часто бывает с условиями NOT EXISTS), поэтому С = 1, и вычисляем (С - 1 + (t/q))/C --(1-1 + (5/50))/1 = 0,1.

Теперь обратимся к правилам настройки подзапросов, имея полную диаграм му запроса. Согласно шагу 1, убедимся, что антисоединение с 03 выражено как кор релированный подзапрос NOT EXISTS, а не как некоррелированный подзапрос NOT IN Шаг 2 не применяется, так как у нас нет полусоединений (с условиями EXISTS) у которых указатели стрелки посередине связи указывают вниз. Выполняя шаг 3 найдем наименьший корреляционный коэффициент предпочтения - 0,01 для по лусоединения с 04, поэтому следует выразить это условие как некоррелированный подзапрос IN и убедиться, что остальные условия типа EXISTS выражены как явные условия EXISTS для коррелированных подзапросов. Оптимизируя подзапрос под 04, как если бы это был отдельный запрос, находим, следуя правилам для простых



запросов, что начальный порядок соединения - (D4. S4.S6.S5. S7). Начиная с этого момента, база данных должна вьшолнить операцию уникальной сортировки по внешнему ключу D4, указывающему на М в этом полусоединении. Вложенные циклы перейдут к М по индексу по первичному ключу М. Оптимизируйте запрос, начиная с М, как если бы условия подзапроса для D4 не сушествовали.

Шаг 4 не применяется, так как мы начали с подзапроса с условием IN. Шаг 5 следует выполнить, так как в узле М мы находим остальные три соединения с подзапросами. Полусоединение с D1 ведет себя как узел снизу с коэффициентом фильтрации 0,24 - немного хуже, чем А1, но лучше, чем А2. Полусоединение с D2 ведет себя как узел внизу с коэффициентом фильтрации 0,99, чуть лучше, чем соединение вниз с не фильтрованным узлом, но не так хорошо, как соединение с А1 или А2. Антисоединение с D3 выглядит лучше всех остальных, как и многие селисгивные антисоединения, так как ведет себя как узел внизу с коэффициентом фильтрации 0,1 - лучше, чем у остальных.

Таким образом, далее выполняем условие NOT EXISTS для D3 и находим новый порядок соединения (D4, S4, S6. S5. S7. М. D3). Так как подзапрос с D3 состоит из одной таблицы, возврашаемся во внешний запрос и находим следующий лучший среди находящихся внизу узлов - узел А1. Это позволяет вьшолнить соединение с В1, но В1 менее привлекателен, чем еще один возможный вариант, D1, уточненный коэффициент фильтрации подзапроса которого равен 0,24, поэтому далее присоединяем D1. Начав обработку этого подзапроса, необходимо закончить его, следуя обычным правилам оптимизации простого подзапроса, и начиная с D1 как с ведущего узла.

Теперь допустимыми становятся узлы А2, В1 и D2, которые лучше всего присоединять именно в этом порядке, о чем говорят их коэффициенты фильтрации или (для D2) уточненный коэффициент фильтрации подзапроса. После соединения с А2 появляется новый допустимый узел, 82, но его коэффициент фильтрации равен 1,0, и он не так привлекателен, как остальные. Таким образом, присоединяем А2,81 и D2 в указанном порядке, получая порядок соединения (D4. S4. S6. S5. S7. М, D3. А1. D1, S1, S2. А2, В1, D2). Достигнув D2, необходимо завершить этот подзапрос, выполнив соединение с S3. После этого остается присоединить только узел 82 и получить полный порядок соединения как (D4, S4, S6, S5, S7, И, D3, А1, D1. S1. S2, А2. 81, D2, S3, В2).



1 ... 96 97 98 [ 99 ] 100 101 102 ... 107

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика