2009-10-21 68 views
2

有谁能够解释我为什么这个查询需要13秒时:T-SQL:如果我使用表变量,为什么我的查询更快?

SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID, COUNT(*) 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 
GROUP BY Table1.Location, Table2.SID, Table2.CID, Table1.VID 

而这一次只需要1秒:

DECLARE @Test TABLE (Location INT, SID INT, CID INT, VID INT) 

INSERT INTO @Test 
SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 

SELECT Location, SID, CID, VID, COUNT(*) 
FROM  @Test 
GROUP BY Location, SID, CID, VID 

当我从第一次查询中删除GROUP BY需要只需1秒太。我也尝试写一个子选择符并对结果进行分组,但它也需要13秒。我并不是无视这一点。

回答

1

如果您对每个在GROUP BY列(或各一个,或所有列的组合单一指数)

临时版本效果更好的原因的索引GROUP BY可能会表现得更好可能是因为GROUP BY是在一个更小的数据子集上执行的,因此即使没有索引也是快速的。

您的临时表方法绝不是这样做的错误方法。这是您衡量每种方法的专业和客观的情况之一。主表上的索引可能会降低插入/更新速度并增加数据库大小。但是,一旦数据大小随时间增加,临时表可能无法充分执行。

+0

好的,谢谢。我虽然认为GROUP BY是在WHERE之后执行的,所以查询也会将较小的结果集分组。 – Torben 2009-10-21 11:48:10

+1

SQL可以做到这一点,但它也不能。要做的事情越是“猜测”,那么错误发生的可能性就越大。因此,索引或过滤结果可以在这种情况下帮助它。正如Jim G所说,比较执行计划,它会告诉你究竟有什么区别。 – 2009-10-21 12:39:33

4

比较两个查询的execution plans

+1

+1 - 总是比较你正在努力的任何查询的执行计划。 – 2009-10-21 10:34:44

1

可能是您在第一个查询中进行分组和计数的查询结果大于第二个查询中使用较小数据集的查询的结果。可能是索引问题。一旦你修复了它,不要忘记重新检查更大的结果集,因为“更好的”查询可以在更大的数据集上执行得更好。

相关问题