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

Sha*_*ame 3 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
Run Code Online (Sandbox Code Playgroud)

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

问候

Mar*_*ith 7

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

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

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

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