INNER JOIN sql табличная переменная ON VS.ВНУТРЕННЕЕ СОЕДИНЕНИЕ (выбрать) ВКЛ - PullRequest
3 голосов
/ 11 октября 2011

Мне интересно, является ли использование табличной переменной более или менее производительным, чем использование внутреннего соединения (выбрать)
Пример:

DECLARE @tab TABLE(Id int)  
INSERT INTO @tab  
SELECT Id  
FROM SomeTable  
WHERE SomeDate = "10 DAYS AGO" 

SELECT *
FROM SomeOtherTable
INNER JOIN @tab t
ON SomeOtherTable.id = t.id  

--VERSUS--

SELECT *  
FROM SomeOtherTable  
INNER JOIN (SELECT Id FROM SomeTable WHERE SomeDate = "10 DAYS AGO") t  
ON SomeOtherTable.id = t.id

Для больших запросов первый более удобен в обслуживании, если вам нужно выполнить одно и то же соединение несколько раз, но какой из них наиболее эффективен?

Привет

1 Ответ

7 голосов
/ 11 октября 2011

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

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

Однако, если второй запрос дорогой для оценки, так как SomeDate не проиндексирован, вы можете получить улучшенную производительность от материализации этого предварительного (по сравнению с многократной повторной оценкой).

Вы также можете рассмотреть возможность использования таблицы #temp, поскольку это позволяет избежать проблемы статистики. Некоторые люди предлагают никогда , используя переменную таблицы в JOINs

...