3

我想知道使用表变量是否比使用内部联接(选择)的性能更高或更低
示例:

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

对于大型查询,如果您必须多次进行相同的连接,第一个更易于维护,但性能最高的是什么?

问候

4

1 回答 1

7

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

这意味着有时你会得到一个次优的连接策略。第二个版本可以使用统计信息,也避免了将中间结果插入临时对象的开销。

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

您还可以考虑使用#temp表,因为这样可以避免统计问题。有些人建议永远不要在 JOIN 中使用表变量

于 2011-10-11T09:46:30.983 回答