2011-10-11 79 views
2

我想知道如果使用表变量比使用内部联接(选择)
实施例更多或更少的高性能:SQL INNER JOIN表变量ON VS. INNER JOIN(选择)ON

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 **解释**,如果我一般没有错,你想要一个技巧,使内部(选择)首先执行,从内向外执行。另外谷歌的SQL查询优化或SQL连接优化 – Melsi

+0

我假定SQL Server,请让我知道如果这是正确的。 –

回答

7

SQL Server不维护详细的统计数据表变量或自动重新编译以反映较少的颗粒基数信息的变化(不包括TF 2453),所以一般会假定他们输出的单排。

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

但是,如果第二个查询的开销非常大,因为SomeDate没有编入索引,您可能会从实现此前期(与反复重新评估相比)中获得改进的性能。

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