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

1 ... 71 72 73 [ 74 ] 75 76 77 ... 107


AND DD.Status Code = ODT.Code

AND ODT.Codejype = Orderjetailjtatus

AND S.Shipment Date > :now - 1

AND EXISTS (SELECT null

FROM Orders 0. Customers C. Codejranslations DT.

Customerjypes CT WHERE C.CustomerJype ID = a.CustomerJype ID AND CT.Text = Government AND OD. OrderJD - 0. Order JD AND D.Customer ID - C.Custoiiier ID AND O.Status Code - OT.Code AND O.CompletedJlag - N AND ОТ.Codejype - ORDER STATUS AND ОТ.Text !- Canceled! ORDER ВУ <Стол6иь1 только из внешнего здпроса>

Используя новые условные обозначения для полусоединений, этот запрос можно изобразить в виде диаграммы на рис. 7.29.


Рис. 7.29. Сложный пример полусоединения с корреляционной связью с первичным ключом корневой детальной таблицы подзапроса

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

SELECT <толбиы только из исходного внешнего запроса> FROM Order Details 00. Products P, Shipments S, Addresses A, Codejranslations OCT.

Orders 0. Customers C. Code Translations ОТ, Customer Types CT WHERE OD,ProductJd - P.Product Td AND P.Unit Cost > 100 AND OD.Shipment Id - S.Shipment Id AND S.AddressJd - A.Address IdT+) AND OD. Status Jode - ODT. Code AND DDT.Codejype - Order Detail Status AMD S.ShipmentJate > :now~- 1

AND C.CustomerJypejd - CT.CustomerJypejd

AND CT.Text - Government

AND OD.Order Id - 0.Order Id



AND O.Customer Id - C.Custonier Id AND O.Status Code = ОТ.Code AND D.CompletedJlag = N AND OT.CodeJype = DRDERJTATUS AND ОТ.Text != Canceled ORDER BY <Стопбцы только из искодного внешнего запросд>

Я специально записал эту версию с отступами, чтобы переход от предыдущей версии был очевиден. Диаграмма запроса также практически идентична, что видно на рис. 7.30.


Рис. 7.30. Тот же запрос, преобразованный, чтобы слить подзапрос с внешним запросом

У этой новой формы есть существенные дополнительные степени свободы, позволяющие провести соединение с фильтрованным узлом Р после соединения с хорошо фильтрованным узлом О, но до соединения с практически не отфильтрованным узлом от. В исходной форме базе данных пришлось бы полностью обработать всю ветвь подзапроса перед тем, как перейти к соединениям со следующими узлами внешнего запроса. Так как присоединение подзапроса в подобных сл5Д1аях может только помочь и при этом получается диаграмма запроса, которую вы уже умеете оптимизировать, далее в этой главе я буду предполагать, что вы присоединяете подзапросы такого типа к внешним запросам. Я буду рассматривать только диаграммное изображение и оптимизацию других типов запросов.

Теоретически можно применять этот же трюк со слиянием подзапросов типа EXISTS, когда стрелка полусоединения указывает на детальный конец соединения, но это сложно и менее вероятно, что он поможет улучшить производительность запроса. Рассмотрим предьщущий запрос к отделам с условием EXISTS для Empl oyees:

SELECT ...

FROM Departments D

WHERE EXISTS (SELECT NULL

FROM Employees E

WHERE E.DepartmentJD = D.Department ID) Следующие проблемы возникают при попытке использовать такой же трюк в данном сл5Д1ае.

Исходный запрос возвращает максимум одну строку на каждую строку из главной таблицы для каждого отдела. Чтобы пол5Д1Ить такой же результат от преобразованного запроса с обычным соединением с детальной таблицей ( Empl oyees ),



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

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

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

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

1. Пусть D - детальный коэффициент соединения для полусоединения, а М - главный коэффициент соединения. Пусть S - лучший (наименьший) коэффициент фильтрации среди всех узлов в подзапросе, а R - лучший (наименьший) коэффициент фильтрации среди всех узлов во внешнем запросе.

2. Если DxS<MxR, то корреляционный коэффициент предпочтения равен (D x S)/(M x R).

3. Иначе, если S > R, то корреляционный коэффициент предпочтения равен S/R.

4. Иначе, пусть Е - измеренное время вьшолнения наил5Д1шего плана исполнения, который начинает с внешнего запроса и переходит к подзапросу (следуя логике EXISTS). Пусть /- измеренное время вьшолнения наилучшего плана, который начинает с внутреннего запроса и переходит к внешнему (следуя логике IN). Пусть корреляционный коэффициент предпочтения равен 1/Е. Если вы смогли оценить корреляционный коэффициент предпочтения при помощи шага 2 или 3, то на основе этих значений можете уверенно выбрать направление обработки подзапроса, не измеряя реальное время вьшолнения.

ПРИМЕЧАНИЕ -

Значение, вычисленное на шаге 2 или 3, может не совпадать с точным временем выполнения, которое вы можете получить измерением. Однако оценка достаточно точна, если она умеренна и избегает значений, которые могут привести к неверному выбору ведущего запроса между внешним запросом и подзапросом. Правила на шаге 2 и 3 специально предназначены для случаев, когда такая надежная, умеренная оценка вполне применима.

Если на шаге 2 или 3 вы не смогли получить правильную оценку, то безопаснее и проще всего использовать значение, полученное при реальном измерении. В таком редком сл}Д1ае поиск безопасного вычисленного значения будет намного сложнее, и результат не оправдает усилий.

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

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



1 ... 71 72 73 [ 74 ] 75 76 77 ... 107

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