我正在尝试调整以下查询,无论作为参数传入什么值,都需要 15-16 秒,查询是:
select distinct d.documentpath as path, d.documentname as name, d.datecreated as created, pc.DateProcessed
from datagatheringruntime dgr
inner join processentitymapping pem on pem.entityid = dgr.entityid
inner join document d on d.entityid = pem.entityid or d.unitofworkid = pem.processid
left join PendingCorrespondence pc on pc.PendingCorrespondenceId = d.PendingCorrespondenceId
where rootid = @P0 and dgr.name in('cust_pn', 'case_pn')
OPTION(RECOMPILE)
我已经更新了查询所涉及的所有表的统计信息(不包括DataGatheringRuntime
在 ~ 处很大的表100GB
),并尝试使用 a 重构查询,CTE
但获得了相同的执行计划并需要一些帮助。
实际的执行计划可以在这里找到:
https://www.brentozar.com/pastetheplan/?id=ByUVIqlFE
从执行计划中可以清楚地看出,问题出在表上的非聚集索引之后的外部输入上nested loop join
,但我不知道如何解决该问题,并希望得到任何指导。lazy table spool
scan
IX_Camunda_1
Document
我会尝试删除和
OR
之间的连接中的子句document
processingentitymapping
你可以这样做
UNION
原因是工作台线轴正在给
NESTED LOOPS
操作员 喂食在这个嵌套循环上,运算符是
OR
谓词。过滤掉,直到我们剩下 9 行。
将 更改
OR
为 aUNION
应该删除线轴,您可能需要在删除OR
.重写后可以提高性能的索引
UNION
有关此问题的另一个示例,请参见此处
DataGatheringRuntime table which is quite big at ~100GB)
通过将它们放在表#temp
中或CTE
然后删除
Distinct
. 如果存在重复数据,则查找重复数据背后的原因并通过编写正确的查询来删除重复数据。Distinct
和UNION
在同一个查询中的目的是什么?