sql INNER JOIN表变量ON VS. INNER JOIN(选择)ON

时间:2011-10-11 09:42:26

标签: sql sql-server performance database-performance

我想知道使用表变量是否比使用内连接(select)更多或更少的性能 示例:

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 个答案:

答案 0 :(得分:7)

SQL Server不维护表变量的详细统计信息或自动重新编译以反映不太精细的基数信息更改(没有TF 2453),因此通常会假设它们输出单行。

这意味着有时您将获得次优加盟策略。第二个版本可以使用统计信息,也可以避免将中间结果插入临时对象的开销。

但是,如果评估第二个查询的成本很高,因为SomeDate没有编入索引,那么预先实现这一点可能会提高性能(与反复重新评估相比)。

您还可以考虑使用#temp表,因为这可以避免统计问题。 Some people suggest never using a table variable in JOINs