2011-10-11 3 views
2

Я интересно, если с помощью переменной таблицы более или менее производительные, чем при использовании внутреннего соединения (выбор)
Примера:sql INNER JOIN переменная таблицы ON VS. INNER JOIN (выберите) ПО

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 

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

Привет

+0

Как насчет 'SELECT * FROM SomeOtherTable WHERE Id IN (SELECT Id FROM SomeTable WHERE SomeDate =" 10 DAYS AGO ")', индексирование для 'SomeDate' и в том числе' Id'? –

+0

проверить с mysql ** объяснить **, если я не ошибаюсь в общем, вы хотите получить трюк, чтобы сделать внутреннее (selct from), выполненное первым, изнутри вычеркнуто. Также google для оптимизации запросов sql или оптимизации соединения sql – Melsi

+0

Я предположил, что SQL Server, сообщите мне, если это правильно. –

ответ

7

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

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

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

Вы также можете рассмотреть таблицу #temp, так как это позволяет избежать проблемы с статистикой. Some people suggest never using a table variable in JOINs