Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 113

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 107 108 109 110 111 112 < 113 > 114 115 116 117 118 119 .. 161 >> Следующая


Диаграммное изображение подзапросов EXISTS

На рис. 7.27 я показал условные обозначения, которые использую для диаграммного изображения запроса с подзапросом типа EXISTS (который может быть выражен в виде эквивалентного подзапроса IN). Этот рисунок относится к предыдущему подзапросу EXISTS:
230

7. Диаграммное изображение и настройка сложных SQL-запросов

SELECT ... FROM Departments D WHERE EXISTS (SELECT NULL

FROM Employees E

WHERE E.Department_ID = D.Department_ID)

E

20,0.8

і kE 20

Ў 0.98 D

Рис. 7.27. Простой запрос с подзапросом

Для корреляционного соединения (также называемого полусоединением применительно к подзапросам типа EXISTS) Departments с Employees диаграмма начинается с той же статистики соединения, которая приведена для рис. 5.1.

Полусоединение, связывающее внутренний запрос с внешним, — это связь с указателем на том конце (или обоих концах), который указывает на первичный ключ. Как и для любого соединения, на обоих концах полусоединения указаны коэффициенты, представляющие те же статистические свойства, которые у этого соединения были бы в обычном запросе. Посередине связи я рисую стрелку, указывающую от коррелированного узла во внешнем запросе на коррелированный узел в подзапросе. Рядом с центральным указателем стрелки я рисую букву Е, чтобы показать, что это полусоединение для подзапроса EXISTS или IN.

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

Связи, представляющей полусоединение, требуется до двух новых чисел, чтобы передать свойства подзапроса, упрощающие выбор наилучшего плана. На рис. 7.27 показаны оба дополнительных значения, которые иногда требуются при выборе оптимального плана обработки подзапроса.

Первое значение, рядом с буквой E (20 на рис. 7.27) — это корреляционный коэффициент предпочтения. Корреляционный коэффициент предпочтения равен отношению I/E. E — это установленное или измеренное время выполнения наилучшего плана в случае, когда он выполняется от внешнего запроса к подзапросу (следуя логике EXISTS). I — это установленное или измеренное время выполнения наилучшего плана, когда он выполняется от внутреннего запроса к внешнему запросу (следуя логике IN). Вы всегда можете вычислить этот коэффициент, замерив время выполнения обеих форм запроса. Обычно это не представляет большой проблемы, если только вам не усложняет жизнь комбинация многих подзапросов. Скоро я объясню несколько правил большого пальца для измерения соотношения I/Е более или менее точно, но даже грубая оценка подходит для выбора плана, когда, как это часто бывает, значение либо намного меньше 1,0, либо намного больше 1,0. Когда корреляционный коэффициент предпочтения больше 1,0, выбирайте
Запросы с подзапросами

231

коррелированный подзапрос с условием EXISTS и план, который начинает с внешнего запроса и идет к подзапросу.

Другое новое значение — это уточненный коэффициент фильтрации подзапроса (0,8 на рис. 7.27), который записывается рядом с детальным коэффициентом соединения. Это установленное значение, которое помогает выбрать лучшее место в порядке соединения для проверки условия подзапроса. Он используется только в запросах, начинающихся с внешнего запроса, поэтому исключайте его из связи полусоединения (с корреляционным коэффициентом предпочтения, меньшим 1,0), которое превращаете в ведущий запрос в плане.

ПРИМЕЧАНИЕ --------------------------------------------------------------------

Если у вас несколько полусоединений с корреляционным коэффициентом предпочтения, меньшим 1,0, то начинать следует с подзапроса с наименьшим коэффициентом, и вам все так же понадобятся уточненные коэффициенты фильтрации для остальных подзапросов.

Перед тем как объяснить процесс вычисления корреляционных коэффициентов предпочтения и уточненных коэффициентов фильтрации подзапросов, давайте выясним, когда они нам нужны. На рис. 7.28 показана частичная диаграмма запроса для подзапроса типа EXISTS, в котором корневая детальная таблица подзапроса находится на конце полусоединения, указывающем на первичный ключ.

R

Рис. 7.28. Полусоединение с первичным ключом

Здесь полусоединение функционально ничем не отличается от обычного соединения, так как запрос никогда не найдет более одного соответствия в таблице M для данной строки из внешнего запроса.

ПРИМЕЧАНИЕ---------------------------------------------------------------------------

Я предполагаю, что все поддерево под вершиной M соответствует нормальной форме (то есть все связи указывают вниз на первичные ключи), а полный подзапрос однозначно отображается на строки из корневой детальной таблицы M поддерева.
Предыдущая << 1 .. 107 108 109 110 111 112 < 113 > 114 115 116 117 118 119 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100