|
Программирование >> Полное сканирование таблицы
Соединение Е. Departrient ID = D. Department ID в каждом из этих запросов - это корреляционное соединение, которое ставит в соответствие друг другу строки во внешнем запросе и подзапросе. У запроса EXISTS есть альтернативная эквивалентная форма: SELECT ... FROM Departments D WHERE D.Department ID IN (SELECT E.Department ID FROM Employees E) Taic как функционально эти формы эквивалентны, а диаграмма должна быть непредвзятой по отношению к обеим формам, то диаграммы для них выглядят одинаково. Только после оценки диаграммы следует делать выбор, какая из форм лучше решает проблему настройки и выражает лучший путь к данным. Изображение запросов с подзапросами на диаграммах Игнорируя соединение, которое связывает внешний запрос с подзапросом, вы всегда можете создать отдельные, независимые диаграммы запросов для каждого из двух запросов. Единственный открытый вопрос - как следует представлять отношение между этими двумя диаграммами, которое объединяет их в одну. Как объясняет форма EXISTS предыдущего запроса, внешний запрос связан с подзапросом при помощи корреляционного соединения. У этого соединения есть особое свойство - для каждой строки внешнего запроса база данных прекращает поиск соответствующих строк, считает условие EXISTS удовлетворенным и передает строку внешнего запроса на следующий этап плана исполнения, как только найдет первое соответствие для данного соединения. Когда она находит соответствие для коррелированного подзапроса NOT EXISTS, то прекращает работу, считая условие NOT EXISTS не удовлетворенным, и немедленно отбрасывает строку из внешнего запроса, не выполняя с ней более никаких действий. Такое поведение подразумевает, что диаграмма запроса должна отвечать на четыре особых вопроса о корреляционном соединении. Эти вопросы неприменимы к обычным соединениям. Это обычное соединение? (Нет, это корреляционное соединение с подзапросом.) Какая сторона соединения является подзапросом, а какая - внешним запросом? Его можно выразить как запрос EXISTS или как запрос NOT EXISTS? Как скоро в плане исполнения следует выполнять подзапрос? Работая с подзапросами и рассматривая эти вопросы, помните, что вам все так же нужно передать на диаграмме свойства, характерные для любых соединений - какой конец соединения относится к главной таблице и каковы коэффициенты соединения. Диаграммное изображение подзапросов EXISTS На рис. 7.27 я показал условные обозначения, которые использую для диаграммного изображения запроса с подзапросом типа EXISTS (который может быть выражен в виде эквивалентного подзапроса IN). Этот рисунок относится к предыдущему подзапросу EXISTS: SELECT ... FROM Departments О WHERE EXISTS (SELECT NULL FROM Employees E WHERE E.Department ID = D.Department ID) 20.0.8 kE20 УО.98 D Рис. 7.27. Простой запрос с подзапросом Для корреляционного соединения (также называемого полусоединением применительно к подзапросам типа EXISTS) Departments с Employees диаграмма начинается с той же статистики соединения, которая приведена для рис. 5.1. Полусоединение, связывающее внутренний запрос с внещним, - это связь с указателем на том конце (или обоих концах), который указывает на первичный ключ. Как и для любого соединения, на обоих концах полусоединения указаны коэффициенты, представляющие те же статистические свойства, которые у этого соединения были бы в обычном запросе. Посередине связи я рисую стрелку, указывающую от коррелированного узла во внешнем запросе на коррелированный узел в подзапросе. Рядом с центральным указателем стрелки я рисую букву Е, чтобы показать, что это полусоединение для подзапроса EXISTS или IN. В этом случае часть диаграммы, представляющая подзапрос, - это один узел, то есть у подзапроса нет собственных соединений. В более редких случаях внещний запрос тоже отображается как единственный узел, представляющий внешний запрос без собственных соединений. Синтаксис намеренно не ограничивается, разрешая такие ситуации, как несколько подзапросов, связанных с внешним запросом, подзапросы с собственным сложным скелетом соединения и даже подзапросы, указывающие на еще более глубоко вложенные собственные подзапросы. Связи, представляющей полусоединение, требуется до двух новых чисел, чтобы передать свойства подзапроса, упрощающие выбор наилучшего плана. На рис. 7.27 показаны оба дополнительных значения, которые иногда требуются при выборе оптимального плана обработки подзапроса. Первое значение, рядом с буквой Е (20 на рис. 7.27) - это корреляционный коэффициент предпочтения. Корреляционный коэффициент предпочтения равен отношению I/E. Е - это установленное или измеренное время выполнения наилучшего плана в случае, когда он выполняется от внешнего запроса к подзапросу (следуя логике EXISTS). I - это установленное или измеренное время выполнения наилучшего плана, когда он выполняется от внутреннего запроса к внешнему запросу (следуя логике IN). Вы всегда можете вычислить этот коэффициент, замерив время вьшолнения обеих форм запроса. Обычно это не представляет большой проблемы, если только вам не усложняет жизнь комбинация многих подзапросов. Скоро я объясню несколько правил большого пальца для измерения соотношения I/E более или менее точно, но даже грубая оценка подходит для выбора плана, когда, как это часто бывает, значение либо намного меньше 1,0, либо намного больше 1,0. Когда корреляционный коэффициент предпочтения больше 1,0, выбирайте коррелированный подзапрос с условием EXISTS и план, который начинает с внешнего запроса и идет к подзапросу. Другое новое значение - это уточненный коэффициент фильтрации подзапроса (0,8 на рис. 7.27), который записывается рядом с детальным коэффициентом соединения. Это установленное значение, которое помогает выбрать Л5шее место в порядке соединения для проверки условия подзапроса. Он используется только в запросах, начинающихся с внешнего запроса, поэтому исключайте его из связи полусоединения (с корреляционным коэффициентом предпочтения, меньшим 1,0), которое превращаете в ведущий запрос в плане. ПРИМЕЧАНИЕ Если у вас несколько полусоединений с корреляционным коэффициентом предпочтения, меньшим 1,0, то начинать следует с подзапроса с наименьшим коэффициентом, и вам все так же понадобятся уточненные коэффициенты фильтрации для остальных подзапросов. Перед тем как объяснить процесс вычисления корреляционных коэффициентов предпочтения и уточненных коэффициентов фильтрации подзапросов, давайте выясним, когда они нам нужны. На рис. 7.28 показана частичная диаграмма запроса для подзапроса типа ЕХISTS, в котором корневая детальная таблица подзапроса находится на конце полу соединения, указывающем на первичный ключ. Рис. 7.28. Полусоединение с первичным ключом Здесь полусоединение функционально ничем не отличается от обьганого соединения, так как запрос никогда не найдет более одного соответствия в таблице М для данной строки из внешнего запроса. ПРИМЕЧАНИЕ- Я предполагаю, что все поддерево под вершиной М соответствует нормальной форме (то есть все связи указывают вниз на первичные ключи), а полный подзапрос однозначно отображается на строки из корневой детальной таблицы М поддерева. Так как функционально полусоединение ничем не отличается от обычного соединения, вы можете добиться более высокой степени свободы в плане исполнения, явно исключив условие EXISTS и соединив подзапрос с внешним запросом. Например, рассмотрим такой запрос: SELECT <Столбцы только из внешнего запроса> FROM Order Details OD. Products P. Shipments S, Addresses A. Code Translations ODT WHERE OO.ProductJD = P.ProdUCtJD AND P.Unit Cost > 100 AND OD.ShipmentJD = S.ShipmentJD AND S.Address ID = A.Address ID(+)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |