Книга: 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. Следовательно, коррелированный подзапрос должен быть выполнен для каждой строки в наборе.
Если выходной набор данных потенциально большой, посмотрите, насколько важна необходимость выполнить включающий поиск. Хорошо продуманный коррелированный запрос полезен для малых наборов. Не существует никаких численных оценок для выбора одного или другого. Как обычно, тестирование в реальных условиях - единственно надежный способ решить, что лучше работает для ваших конкретных потребностей.
Когда не надо использовать подзапросы
Подход, основанный на подзапросах, становится странным, когда вам нужно получить более одного поля из той же таблицы. Подзапрос может вернуть одно и только одно поле. Для получения нескольких полей требуется отдельный коррелированный подзапрос и его алиас для каждого выбираемого поля. Если левое соединение способно выполнить эти условия, то его всегда следует использовать.
- Подзапросы
- Коррелированные подзапросы
- 4. Использование подзапросов
- 3.1. Удаленное соединение
- Присоединение ссылки к объекту
- Соединение точек социальных медиа в целях улучшения потребительского опыта
- Как разорвать соединение?
- Глава 8 DSL-соединение с Интернетом
- Присоединение: две семантики - ссылок и значений
- Присоединение
- Присоединение: ссылочное и копии
- Гибридное присоединение