Производительность SQL-запроса JOIN

Я хотел знать, что лучше с точки зрения производительности: поставить условия в JOIN? (x JOIN y on x.hi = y.hi AND ....) или, может быть, поместить его под WHERE, а JOIN оставить только с условием пересечения.

спасибо, ребята


person Himberjack    schedule 28.01.2010    source источник
comment
Точный дубликат: stackoverflow.com/ вопросов/1018822/ и 100 других вопросов.   -  person Quassnoi    schedule 28.01.2010


Ответы (4)


Это будет зависеть от механизма оптимизации запросов и от того, как он разбивает запрос на логические операторы запроса.

С MS SQL Server вы можете просмотреть план выполнения, но обычно нет никакой разницы, поскольку оптимизатор увидит оба варианта как эквивалентные.

person Johnno Nolan    schedule 28.01.2010

На StackOverflow есть аналогичный вопрос здесь.

Во многом это вопрос того, какой синтаксис вы предпочитаете. Насколько я понимаю, оптимизатор SQL должен иметь возможность оценивать их с небольшой разницей в производительности.

person Bernard Dy    schedule 28.01.2010
comment
Это, безусловно, влияет на производительность некоторых БД. К сожалению, он не говорит, что он использует. - person Craig Stuntz; 28.01.2010
comment
У вас обоих есть хорошие стороны... мой ответ основан на знакомстве с Oracle и SQL Server. - person Bernard Dy; 30.01.2010

Я не думаю, что это должно влиять на производительность (большинство баз данных могут оптимизировать такие вещи), но они могут повлиять на результаты, если вы используете левое соединение.

SELECT  a.field1
        , a.field2
        , b.field3
FROM  table1 a
LEFT JOIN table2 b
    ON a.id = b.id
WHERE    a.field5 = 'test'
        AND b.field3 = 1

SELECT  a.field1
        , a.field2
        , b.field3
FROM table1 a
LEFT JOIN table2 b
    ON a.id = b.id AND b.field3 = 1
WHERE a.field5 = 'test'

Эти два запроса не возвращают те же результаты, что и первый запрос, поскольку размещение условий в предложении where вместо соединения превращает левое соединение во внутреннее соединение.

person HLGEM    schedule 28.01.2010
comment
Я имею в виду в предположении, что результат тот же, какой из них быстрее? - person Himberjack; 28.01.2010

Что ж, вы не можете использовать *= и =* Синтаксис OUTER JOIN в предложении WHERE в SQL Server 2008 R2

Я бы не хотел, чтобы запрос смешивал 2 стиля

person gbn    schedule 28.01.2010
comment
Черт возьми, вы не должны использовать их даже в SQL Server 2000, поскольку иногда они могут быть неверно истолкованы как перекрестное соединение. - person HLGEM; 29.01.2010
comment
@HLGEM: мы это знаем, конечно, но теперь у нас есть веская причина, чтобы обосновать, почему мы говорим «нет». - person gbn; 29.01.2010
comment
неправильные результаты были недостаточно хороши в качестве оправдания? Конечно был здесь. - person HLGEM; 29.01.2010