Database Programming & Design



         

The SQL Double Double - часть 5


покупаемые калифорнийскими заказчиками:

SELECT SNAME

FROM S BLK1

WHERE NOT EXISTS

(SELECT 1

FROM IT BLK2, ORDERS O

WHERE O.STATE = 'CA'

AND O.ITEM = BLK2.ITEM

AND NOT EXISTS

(SELECT 1

FROM SI BLK3

WHERE BLK3.ITEM = BLK2.ITEM

AND BLK3.S# = BLK1.S#))

Эффективность выполнения запросов с двойной корреляцией и двойным

NOT EXISTS зависит от возможности использования индексов, по

крайней мере, для среднего и нижнего запросов. Если в верхнем

запросе проверяется каждая строка таблицы, то наиболее подходит

последовательный просмотр таблицы. Наличие индексов позволяет

запросу передавать значения из списка без потребности

предварительной полной материализации списка.

Конечно, чем больше значений true возвращает нижний запрос, тем

медленнее выполняется весь запрос целиком. Поэтому, если вероятна

выработка более 25% значений true, более эффективно использовать

следующий синтаксис:

SELECT P.MAJOR

FROM PARTS P, QUE Q

WHERE P.MINOR = Q.ID

GROUP BY P.MAJOR

HAVING COUNT(*) =

(SELECT COUNT(*)

FROM QUE)

Этот запрос выбирает все значения столбца MAJOR, для каждого из

которых множество значений столбца MINOR совпадает с множеством

значений столбца ID таблицы QUE. При наличии более 25% значений

столбца MAJOR, удовлетворяющих условию запроса этот запрос будет

выполняться более эффективно. Если вероятность нахождения "всего

____ что имеет _____ условие(я)" мала, то SQL Double Double

является эффективным оператором реляционного деления.

Подзапросы занимают небольшое, но ответственное место в наборе

средств разработчика, использующего язык SQL. С помощью

подзапросов можно выполнять сравнения данных, которые невозможны

при использовании соединений, такие как сравнение детальных и

суммарных данных. Кроме того, это механизм позволяет эффективно

выполнять проверку существования и реляционное деление.




Содержание  Назад  Вперед