Фильтрация объединений исключительно с использованием WHERE
может быть крайне неэффективной в некоторых распространенных сценариях. Например:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
Большинство баз данных выполнят этот запрос буквально, сначала взяв декартово произведение из таблиц people
и companies
и , а затем с фильтрацией по тем, которые имеют companyID
и id
поля. В то время как полностью неограниченный продукт не существует нигде, кроме как в памяти и только на мгновение, его расчет занимает некоторое время.
Лучший подход - сгруппировать ограничения с JOIN
там, где это уместно. Это не только субъективно легче читать, но и намного эффективнее. Thusly:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
Это немного дольше, но база данных может посмотреть на предложение ON
и использовать его для непосредственного вычисления полностью ограниченного JOIN
, вместо того, чтобы начинать с everything и затем ограничивать , Это быстрее для вычисления (особенно с большими наборами данных и / или объединениями из нескольких таблиц) и требует меньше памяти.
Я изменяю каждый запрос, который использует синтаксис "запятая JOIN
". На мой взгляд, единственной целью его существования является лаконичность. Учитывая влияние на производительность, я не думаю, что это веская причина.