【问题标题】:How can I improve query performance如何提高查询性能
【发布时间】:2016-11-18 17:50:48
【问题描述】:

我有一个永远在旋转的查询。 我是 DBA 方面的新手。我想知道处理此类问题的第一件事是什么?我看了执行计划 该表在 ClassCode 上只有 1 个非聚集索引。我使用这么多 ClassCode 的原因是在 SSRS 报告参数中默认 @ClassCode 将是多个值,超过 200 个。

SELECT  PolicyNumber 
FROM    tblClassCodesPlazaCommercial 
WHERE   PolicyNumber NOT IN (
                            SELECT  PolicyNumber 
                            FROM    tblClassCodesPlazaCommercial 
                            WHERE   ClassCode IN    (
                                                    33489,31439,41894,68189,01239,01199,68528,67139,68128,739889,
                                                    33428,5561,68428,01484,5281,67227,01184,50199,23528,33283,03228,
                                                    50499,41594,50427,5181,31484,03199,6481,68239,50439,68489,36127,    
                                                    50472,67128,23149,33439,03149,5452,23189,50228,01428,69183,50527,
                                                    67499,739189,50159,31183,33499,01283,33128,50239,6451,33159,
                                                    21199,67272,67127,69427,5451,23239,67199,67449,67189,01599,40228,
                                                    50184,5551,33299,7398,40179,40128,50139,7381,33199,50497,23428,33129,
                                                    738299,67149,40184,23128,69199,68499,50299,31449,40497,68169,67197,
                                                    5191,67259,5252,03489,67459,21299,5262,01181,03428,31483,68183,68228,
                                                    31199,40484,738199,03499,31499,40189,7382,67439,21527,50449,01427,
                                                    68199,5453,50528,36228,50259,68299,50227,23459,33528,40199,40427,
                                                    21289,42594,5283,34489,5251,21228,50197
                                                    ) 
                            )

【问题讨论】:

    标签: sql-server tsql reporting-services execution-time notin


    【解决方案1】:

    使用条件聚合来做到这一点

    SELECT  PolicyNumber 
    FROM    tblClassCodesPlazaCommercial 
    group by PolicyNumber
    having count(case when ClassCode IN  (33489,31439,41894,..) then 1 end) = 0
    

    Case 语句将为列表中存在的ClassCode 生成 1,否则将生成 NULL。现在计数聚合将为每个PolicyNumber 计数为 1。通过设置= 0,我们可以确保PolicyNumber 在给定列表中没有任何ClassCode

    Count可以替换为

    SUM(case when ClassCode IN  (33489,31439,41894,..) then 1 else 0 end) = 0
    

    【讨论】:

    • 你需要一个 else 0 吗?我希望不在列表中的值是 NULL,它不 = 0。不过我可能是错的。无论哪种方式,都比 OP 好得多。
    • @scsimon - 简单的事实是 Count 聚合不会计算 NULL 值。如果我在else 部分中添加0,则count 会将其视为一个值并对其进行计数,然后逻辑将进行折腾
    • 谢谢。没有NULLClassCode。所以我应该留下它then 1 end。对吗?
    • 太棒了。如果是Possibe,你能解释一下这背后的逻辑吗?特别是最后的=0?谢谢
    • 这真是太棒了,我没见过有人用过这样的。
    【解决方案2】:

    首先要做的是为 ClassCode 和 PolicyNumber 添加索引。您可以向这些列添加非聚集索引。

    添加索引后,请确保多次运行它,以便 SQL 可以为您构建执行计划。

    这肯定会对您的查询有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2013-03-21
      • 2018-10-19
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多