任何人都可以解释为什么这个查询需要13秒:
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秒。我不解读这个。
答案 0 :(得分:4)
比较两个查询的execution plans。
答案 1 :(得分:1)
如果GROUP BY中的每个列都有一个INDEX(每个列都有一个,或者所有列的组合单个索引),则GROUP BY可能会表现得更好
你的临时版本运行得更好的原因可能是因为GROUP BY是在一个小得多的数据子集上执行的,所以即使没有索引它也很快。
你的临时表方法决不是错误的方法。这是你衡量每种方法的优点和缺点的情况之一。主表上的索引可能会减慢插入/更新速度并增加数据库大小。但是,一旦数据大小随时间增加,临时表可能无法充分执行。
答案 2 :(得分:1)
可能是您在第一个查询中进行分组并依赖于较大查询结果的数据,而不是使用较小数据集的第二个查询。可能是索引问题。一旦你修复它,不要忘记用更大的结果集重新检查,因为“更糟糕”的查询可以用更大的数据集更好地执行。