Добавляя больше условий при присоединении или где лучше? - PullRequest
0 голосов
/ 28 июля 2011
    SELECT C.* 
      FROM Content C
INNER JOIN ContentPack CP ON C.ContentPackId = CP.ContentPackId 
                         AND CP.DomainId = @DomainId

... и:

    SELECT C.* 
      FROM Content C
INNER JOIN ContentPack CP ON C.ContentPackId = CP.ContentPackId
     WHERE CP.DomainId = @DomainId

Есть ли разница в производительности между этими 2 запросами?

Ответы [ 2 ]

7 голосов
/ 28 июля 2011

Поскольку оба запроса используют INNER JOIN, нет никакой разницы - они эквивалентны.
Этого не произошло бы, если иметь дело с OUTER JOIN - критериями в предложении ON применяется перед соединением; критерий в WHERE применяется после объединения .

Но ваш запрос, вероятно, будет работать лучше:

SELECT c.* 
  FROM CONTENT c
 WHERE EXISTS (SELECT NULL
                 FROM CONTENTPACK cp
                WHERE cp.contentpackid = c.contentpackid
                  AND cp.domainid = @DomainId)

Использование JOIN может привести к дублированию при наличии более одной записи CONTENTPACK, связанной с записью CONTENT. И нет смысла ПРИСОЕДИНЯТЬСЯ, если ваш запрос не использует столбцы из таблицы, в которую СОЕДИНЯЕТСЯ ... Соединения не всегда являются самым быстрым способом.

1 голос
/ 28 июля 2011

Разницы в производительности нет, но я бы предпочел внутреннее соединение, потому что я думаю, что оно очень ясно дает понять, что вы пытаетесь объединить в обеих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...