由于选择类似于:
,我的查询运行时间很长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
有人能提出任何改善这种表现的好方法吗?
答案 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...
接下来,你有什么指数?基于我所看到的
你也可以尝试倒转琴键
最后,确保所有数据类型都正确并匹配(即使在第二个计数中)。隐式转换可以扼杀性能。
答案 3 :(得分:0)
你可能在t1上进行了1次扫描,在t2上进行了1次搜索,如果你得到了其他任何东西,要么索引不合适,要么你没有给我们足够的信息。
如果您在t1上进行了1次扫描,在t2上进行了1次搜索,并且您认为此查询接近相应的解决方案(例如,您无法从更快速的查询中获得所需的信息,那么您就看不出来了)可能有最佳计划。