有关提高SQL查询计数性能的建议?

时间:2009-12-22 18:36:12

标签: sql sql-server performance count

由于选择类似于:

,我的查询运行时间很长
SELECT 
Count( Distinct t1.v1),
Count (Distinct 
Case t2.v1 When 'blah' then t1.v1
Else null
End ),
....
FROM t1
LEFT JOIN t2 ON t1.v3 = t2.v3
WHERE t1.myDate BETWEEN @start and @end
AND t2.v5 = @id

有人能提出任何改善这种表现的好方法吗?

4 个答案:

答案 0 :(得分:3)

由于此查询中没有Where子句谓词(无过滤器),因此无论您做什么,它都将涉及完整的表扫描或索引扫描(除非内部连接限制结果集...)。

因此,您可以获得的唯一改进可能是影响正在进行的连接类型。要提高连接的性能,请确保t1.v3和t2.v3列上有索引....

答案 1 :(得分:1)

很难说没有大局,你想要达到的目标等等。

但基于这一点检查的直接事情是索引 - 您是否有合适的索引(例如在t1.v3 / t2.v3上)?如果您确实有适当的索引,它们是否将碎片/统计信息的索引过期了?

执行计划说了什么?

答案 2 :(得分:1)

使用t2.v5 = @id上的过滤器在t2上进行LEFT JOIN会将此更改为内部联接。 您需要...LEFT JOIN t2 ON t1.v3 = t2.v3 AND t2.v5 = @id...

接下来,你有什么指数?基于我所看到的

  • t1:(mydate,v3)INCLUDE(v1)
  • t2:(v3,v5)INCLUDE(v1)

你也可以尝试倒转琴键

最后,确保所有数据类型都正确并匹配(即使在第二个计数中)。隐式转换可以扼杀性能。

答案 3 :(得分:0)

你可能在t1上进行了1次扫描,在t2上进行了1次搜索,如果你得到了其他任何东西,要么索引不合适,要么你没有给我们足够的信息。

如果您在t1上进行了1次扫描,在t2上进行了1次搜索,并且您认为此查询接近相应的解决方案(例如,您无法从更快速的查询中获得所需的信息,那么您就看不出来了)可能有最佳计划。