我试图通过访问具有约 2.5 亿条记录的表的查询来提高性能。从我对实际(未估计)执行计划的阅读来看,第一个瓶颈是如下所示的查询:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a
inner join
#smalltable b on a.fk = b.pk
where
a.added between @start and @end;
Run Code Online (Sandbox Code Playgroud)
有关所涉及的表和索引的定义,请进一步向下查看。
执行计划表明#smalltable 正在使用嵌套循环,并且对hugetable 的索引扫描执行了480 次(针对#smalltable 中的每一行)。这对我来说似乎是倒退,所以我试图强制使用合并连接:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a with(index = ix_hugetable)
inner merge join
#smalltable b with(index(1)) on a.fk = b.pk
where
a.added between @start and @end;
Run Code Online (Sandbox Code Playgroud)
有问题的索引(完整定义见下文)涵盖列fk(连接谓词)、added(在 where 子句中使用)和id(无用)按升序排列,并包括value。
然而,当我这样做时,查询从 2 1/2 分钟到超过 9 分钟。我本来希望提示会强制更有效的连接,只对每个表进行一次传递,但显然不是。
欢迎任何指导。如果需要,提供其他信息。
重新组织表上的索引后,我取得了显着的性能进步,但是在汇总大表中的数据时遇到了新的障碍。结果是按月汇总,目前如下所示:
select
b.stuff,
datediff(month, …Run Code Online (Sandbox Code Playgroud)