Производительность оператора объединения в SQL - PullRequest
2 голосов
/ 11 апреля 2011

Я работаю над SQL Server 2008-R2, и мне нужно использовать объединение нескольких таблиц.В таком случае, какой запрос имеет лучшую производительность по времени, когда используется оператор WHERE или INNER JOIN с оператором ON?оба оператора используют оператор AND для нескольких условий.

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

Пример кода для указанных выше параметров:

1)

SELECT *

FROM T1,T2,T3....

WHERE T1.ID = T2.ID AND

      T1.ID = T3.ID AND

      ....

2)

SELECT *

FROM T1 

     INNER JOIN T2

        ON T1.ID = T2.ID

     INNER JOIN T3

        ON T1.ID = T3.ID

     INNER JOIN .....

Tx.

Ответы [ 4 ]

4 голосов
/ 11 апреля 2011

Быстрый ответ: Нет, различий в производительности нет.

Это довольно часто задаваемый вопрос, который хорошо объяснен здесь: ВНУТРЕННЕЕ СОЕДИНЕНИЕ против предложения WHERE

Механизм оптимизации запросов в SQL-сервере автоматически преобразует оба этих запроса в один и тот же подход для получения результатов.

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

1 голос
/ 11 апреля 2011

Различий в производительности нет.

Однако первый стиль - ANSI-89, и в некоторых магазинах вам сломают ноги.Включая мою.Второй стиль - ANSI-92, он намного понятнее.

Примеры:

Что такое JOIN, а какой фильтр?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

Если у вас есть OUTER JOINs(=*, *=), тогда второй стиль будет работать так, как объявлено.Первый, скорее всего, не будет и также не рекомендуется в SQL Server 2005 +

Стиль ANSI-92 также сложнее для болликса.Со старым стилем вы можете легко получить декартово произведение (перекрестное соединение), если вы пропустите условие.Вы получите синтаксическую ошибку с ANSI-92.

1 голос
/ 11 апреля 2011

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

В случае сомнений используйте «Показать фактический план выполнения» SQL Server Management Studio, чтобы показать относительную производительность двух запросов. Query -> Include Actual Execution Plan

0 голосов
/ 11 апреля 2011

Предполагая, что оба оператора синтаксически идентичны, вы не должны видеть абсолютно никакой разницы в производительности - оптимизатор запросов принимает оператор SQL и превращает его в план запроса, а исходная форма SQL не имеет никакого значения.

99 раз из 100, оптимизатор запросов понимает это полностью и совершенно правильно - раньше можно было сбить с толку оптимизатор, но современные версии SQL Server почти всегда присутствуют.

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

...