Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Подзапрос или соединение?

Подзапрос или соединение?

Запрос из предыдущего примера может быть составлен с использованием левого соединения вместо подзапроса:

SELECT

M.LAST_NAME,

M.FIRST_NAME,

M.ADDRESS1,

M.ADDRESS2,

M.POSTCODE,

R. START_TIME

FROM MEMBERSHIP M LEFT JOIN ROUTES R

ON R.POSTCODE = M.POSTCODE

WHERE M.DOW = 'MONDAY';

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

Разница в стоимости может стать значительной, если коррелированный запрос будет использован вместо внутреннего соединения:

SELECT

M.LAST_NAME,

M.FIRST_NAME, M.ADDRESS1,

M.ADDRESS2,

M.POSTCODE,

R.START _Т1МЕ

FROM MEMBERSHIP M

JOIN ROUTES R

ON R.POSTCODE = M.POSTCODE

WHERE M.DOW = 'MONDAY';

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

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

Когда не надо использовать подзапросы

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

Оглавление книги


Генерация: 1.550. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз