我有一个包含此过滤器的查询:
...
WHERE P.CustomerId = @CustomerId
AND NOT EXISTS (SELECT 1 FROM PaymentRestriction RS
WHERE RS.CustomerId = P.CustomerId )
并且它不会在5分钟内执行。我试图用实际值更改参数:
...
WHERE P.CustomerId = '79579DFB-5610-48E0-A585-08D97867AA1F'
AND NOT EXISTS (SELECT 1 FROM PaymentRestriction RS
WHERE RS.CustomerId = P.CustomerId )
但没有改变,然后我尝试了不同的东西,它只在一秒钟内完成。 :
...
WHERE (P.CustomerId = @CustomerId OR P.CustomerId = '79579DFB-5610-48E0-A585-08D97867AA1F')
AND NOT EXISTS (SELECT 1 FROM PaymentRestriction RS
WHERE RS.CustomerId = P.CustomerId )
我更改了索引并使用了OPTION (RECOMPILE)
但没有改变。我应该在哪里控制和更改?它与统计有关吗?如果是,我该如何解决?
PS:这是一个很长的查询,还有许多其他过滤器。但我猜,问题很明显。
编辑1:我根据相关部分更改了问题中的查询过滤器。
编辑2:我发现连接部分也影响了性能。如果删除连接部分,则在所有条件下都没有问题。我简化了问题仍然存在的查询。这是我的简化查询:
SELECT COUNT(0)
FROM Payment (NOLOCK) P
LEFT JOIN PaymentFile (NOLOCK) PF
ON PF.PaymentFileId = P.PaymentFileId
WHERE -- (P.CustomerId = @Customer OR P.CustomerId = '79579DFB-5610-48E0-A585-08D97867AA1F')
(P.CustomerId = @Customer)
AND NOT EXISTS (SELECT 1 FROM PaymentRestriction RS
WHERE RS.CustomerId = P.CustomerId )
另一个有趣的结果:
COUNT(0)
替换*
,执行时间将从45秒开始下降。到20秒。NOT EXIST
,则执行时间从45秒开始下降。到0.1秒再次。