2016-08-08 5 views
1

У меня есть простой SQL-запрос, который делает INNER JOIN между таблицами A и B с фильтрацией. Таблица A очень велика, а таблица B довольно мала. Я хочу только вернуть строки, соответствующие определенному фильтру, например, table_B.some_col IN ('a', 'b', 'c', 'd'). Конечно, у меня этот фильтр как предложение WHERE. Однако мне было рекомендовано дублировать один и тот же фильтр, но для таблицы A и поместить его в соединение. Например,SQL - внутреннее соединение между большой таблицей и таблицей с фильтрами

SELECT 
* 
FROM table_A 
INNER JOIN table_B 
    ON table_A.pk = table_B.pk 
    AND table_A.some_col IN ('a', 'b', 'c', 'd') 
WHERE 
table_B.some_col IN ('a', 'b', 'c', 'd') 

Утверждается, что при этом улучшается план запроса. К сожалению, из-за ограничений безопасности на моей машине я не могу проверить планы запросов. Это утверждение верно?

+0

удерживайте , ваши два запроса на самом деле разные запросы, без table_A.some_col IN ... вы выбрали бы любой выбранный из B с соответствующим первичным ключом в A - если some_col в B не дублирует значение в A – Cato

ответ

0

Добавление фильтра в And или Where пункта не имеет никакого значения ..

Вот некоторые тесты ..

используется запрос ..
выберите * из заказов о присоединение hr.employees h по h.empid = o.empid

фильтр в и п ..
и EmpID = 4

План выполнения:
enter image description here

Статистика Set IO:

Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Фильтр В тех случаях, когда Статья:
где план EmpID = 4

Исполнение:
enter image description here

Статистика IO:

Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

В каждом случае SQLServer достаточно умен, чтобы изменить запрос (так как он внутреннее соединение) и получить только релевантные строки