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

 

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

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

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


2. Найдем DxS = 0,03 и M х R = 0,01; следовательно, D х S > M х R. Перейдем к шагу 3.

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

Чтобы найти уточненный коэффициент фильтрации подзапроса, сделайте следующее.

1. Обратите внимание, что корреляционный коэффициент предпочтения больше

1, поэтому необходимо перейти к шагу 2.

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

3. Найдем D = 2, и найдем коэффициент фильтрации для узла D, s = 0,1.

4. Так как D > 1, необходимо перейти к шагу 5.

5. Вычислим sxD = 0,2, что меньше 1, поэтому уточненный коэффициент фильтрации вычисляется как (D - 1 + (s х D))/D = (2 - I + (0,1 х 2))/2 = 0,6.

В следующем разделе, посвященном оптимизации подзапросов EXISTS, я проиллюстрирую оптимизацию полной диаграммы, показанной на рис. 7.32.

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

Условия подзапроса, которые можно выразить при помощи NOT EXISTS или NOT IN, проще, чем подзапросы типа EXISTS, в одном отношении — невозможно перейти от подзапроса наружу к внешнему запросу. Это устраняет необходимость в корреляционном коэффициенте предпочтения. Буква Е, указывающая условие подзапроса типа EXISTS, заменяется на букву N, чтобы обозначить условие подзапроса типа NOT EXISTS, а корреляционное соединение теперь называется антисоединением, а не полусоединением, так как оно предназначено для поиска случая, когда для соединения со строками из подзапроса не находится соответствия.

Оказывается, практически всегда условия подзапроса типа NOT EXISTS лучше выражать при помощи NOT EXISTS, а не при помощи NOT IN. Рассмотрим следующий шаблон для подзапроса NOT IN:

SELECT ..

FROM ... Outer_Anti_Joined_Table Duter WHERE...

AND Outer.Some_Key NDT IN (SELECT Inner.Some_Key

FROM ... Subquery_Anti_Joined_Table InnerWHERE <Условия и соединения для таблиц подзапросам

Можно и нужно перефразировать этот шаблон в эквивалентную форму NOT EXISTS: ч
Запросы с подзапросами

237

SELECT ...

FROM ... 0uter_Ant1_Joined_Table Outer WHERE...

AND Outer.Some Key IS NOT NULL AND NOT EXISTS~(SELECT null

FROM ... Subquery_Anti_Joined_Table Inner WHERE <Условия и соединения для таблиц подзапроса>

AND Outer.Some_Key - Inner.Some_Key)

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

Чтобы преобразовать NOT IN в NOT EXISTS без изменения функциональности, необходимо добавить условие NOT nul 1 для ключа корреляционного соединения во внешней таблице. Причиной служит то, что условие NOT IN эквивалентно набору условий «не равно», соединенных условием ИЛИ, но база данных не считает выражение NULL ! “ <Некоторое_значение> истинным, поэтому форма NOT IN отбрасывает все строки из внешнего запроса с равными null ключами корреляционного соединения. Этот факт малоизвестен, поэтому, вероятно, действительным намерением разработчика такого запроса является включение в результат запроса строк, которые форма NOT IN незаметно исключает. При преобразовании форм у вас появляется отличная возможность найти и исправить эту вероятную ошибку.

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

¦ Проверка неселективного условия EXISTS недорога (так как соответствие находится просто, обычно в первой же проверенной строке полусоединения), HO отбрасывает немного строк из внешнего запроса. Чем больше строк вернет подзапрос, тем дешевле и менее селективна проверка условия EXISTS. Если же условие EXISTS селективно, то его проверка, вероятнее всего, дороже, так как при этом должно исключаться соответствие для каждой детальной строки.

¦ Проверка селективного условия NOT EXISTS недорога (так как соответствие находится просто, обычно в первой же проверенной строке полусоединения) и отбрасывает много строк из внешнего запроса. Чем больше строк вернет подзапрос, тем дешевле и селективнее проверка условия NOT EXISTS. С другой стороны, проверка неселективных условий NOT EXISTS также дорога, так как для каждой детальной строки необходимо подтверждение, что соответствия не существует.

Так как преобразование условий подзапроса NOT EXISTS в эквивалентные простые запросы без подзапросов и дорого, и не слишком полезно, лучше использовать подзапросы NOT EXISTS на обоих концах антисоединения: там, где находится главная таблица, и там, где детальная. Очень редко возникает необходимость поиска альтернативных способов выражения условия NOT EXISTS.
Предыдущая << 1 .. 110 111 112 113 114 115 < 116 > 117 118 119 120 121 122 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100