SQL查询 - 相同的过滤器(显然不是)但性能差异巨大

时间:2017-03-09 10:04:10

标签: sql-server performance query-performance

我有一个包含此过滤器的查询:

... 
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秒。
  • 如果我取消注释第一个过滤行并注释第二个过滤行,则执行时间从45秒降至0.1秒
  • 如果我删除最后一个过滤器NOT EXIST,则执行时间从45秒开始下降。到0.1秒再次。

0 个答案:

没有答案