Является ли подход «Предложение» или «Где» более эффективным для ограничения набора результатов? - PullRequest
3 голосов
/ 28 октября 2010

Мне нужно ограничить результирующий набор для оператора SELECT, основываясь на том, что у Col1 есть потенциальные значения от 1 до многих Например, я хочу вернуть все строки, в которых Col1 равно 1, 2 и 3.

Пока у меня есть два разных подхода к ограничению набора результатов:

Подход № 1

Inner Join Table1 On (Table2.ColA=Table1.ColA) And (Col1=1 And Col1=2 And Col1=3)

Подход № 2

Inner Join Table1 On Table2.ColA=Table1.ColA
Where (Col1=1 And Col1=2 And Col1=3)

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

Спасибо, Chris

Ответы [ 5 ]

8 голосов
/ 28 октября 2010

ВНУТРЕННИЕ СОЕДИНЕНИЯ

При работе с INNER JOIN не имеет значения, будет ли фильтрация таблицы, к которой присоединяется, следовать предложению ON или произойдет в предложении WHERE - она ​​выдаст тот же набор результатов.

НАРУЖНЫЕ СОЕДИНЕНИЯ

Но это не так для НАРУЖНЫХ СОЕДИНЕНИЙ ...
В OUTER JOIN, если вы укажете критерии фильтрации в предложении ON - критерии будут применены до , когда будет выполнено JOIN. Вот пример:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
                   AND b.col1 IN (1,2,3)

Это может существенно повлиять на набор результатов по сравнению с тем, если критерии были указаны в ГДЕ:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
    WHERE b.col1 IN (1,2,3)

Заключение

Все, что имеет значение, это то, что вы:

  1. Знай разницу
  2. Соответствуют вашей структуре запросов
3 голосов
/ 28 октября 2010

Это не вопрос эффективности. Ваши ограничения ограничивают количество строк, которые будут возвращены; поэтому они логически относятся к предложению WHERE.

0 голосов
/ 28 октября 2010

Неважно, оптимизатор выдаст тот же запрос в конце. Я думаю, что фильтрация в предложении WHERE более удобна для чтения, особенно для внутренних объединений.

0 голосов
/ 28 октября 2010

В вашем описании написано "1, 2 или 3", поэтому вы захотите

Where (Col1=1 Or Col1=2 Or Col1=3)

или вы могли бы сделать это

Where Col1 in (1, 2, 3)
0 голосов
/ 28 октября 2010

Предварительно очищено WHERE (подзапрос), но проверьте план запроса на разницу:

SELECT ...
FROM   ...
JOIN   (select ... from table1 where col1 in (1,2,3) ) as Table1
ON     Table1.ColA = Table2.ColA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...