Sql server 减少SQL查询的执行时间

Sql server 减少SQL查询的执行时间,sql-server,tsql,query-performance,Sql Server,Tsql,Query Performance,我有一个问题,就是如何在保持查询准确性的同时提高查询的处理效率。在显示查询之前,我想指出一些基本信息 我有一个案例,它操纵where-子句来获取父对象的所有子对象。基本上,我有两种类型的数据需要显示;一种红色和一种绿色。默认情况下,红色类型有一列(TRK\u TrackerGroup\u LKID2)设置为NULL,而绿色数据在所述列中有一个值(范围为5-7) 我的问题是,我需要提取这两种类型的数据,以准确地获得视图中未解决问题的计数,但这样做(通过添加案例)执行时间从

我有一个问题,就是如何在保持查询准确性的同时提高查询的处理效率。在显示查询之前,我想指出一些基本信息

我有一个案例,它操纵
where
-子句来获取父对象的所有子对象。基本上,我有两种类型的数据需要显示;一种红色和一种绿色。默认情况下,红色类型有一列(
TRK\u TrackerGroup\u LKID2
)设置为
NULL
,而绿色数据在所述列中有一个值(范围为5-7

我的问题是,我需要提取这两种类型的数据,以准确地获得视图中未解决问题的计数,但这样做(通过添加案例)执行时间从<1秒15秒

这是一个查询(使用上述案例):

它作为“父级”发挥作用,即从每个子组获取最新插入的数据集(使用日期戳)。这对于以后在SSRS报告中生成父报告是必要的,但目前我的问题(如上所述)是执行时间

我想听听有没有关于如何在保持查询准确性的同时减少执行时间的建议

预期产出:

如果没有这个案例,我会得到:


查询中最有问题的部分似乎是相关子查询,因为您必须为每一行调用它

您应该首先对此进行优化。为此,您可以添加索引,引擎可以使用这些索引快速计算每行的值

根据您的查询,我将添加以下两个索引倍数:

  • 在表
    trackerfeatures
    上,索引字段:
    trk_startdateid,日期戳

  • 在表
    trk\u trackerfeatures\u lk
    上,索引字段:
    id,trk\u trackergroup\u lkid


  • 查询中最有问题的部分似乎是相关子查询,因为必须为每一行调用它

    您应该首先对此进行优化。为此,您可以添加索引,引擎可以使用这些索引快速计算每行的值

    根据您的查询,我将添加以下两个索引倍数:

  • 在表
    trackerfeatures
    上,索引字段:
    trk_startdateid,日期戳

  • 在表
    trk\u trackerfeatures\u lk
    上,索引字段:
    id,trk\u trackergroup\u lkid


  • 您的问题是这种情况不能使用
    索引

    AND TF.readyforwork = CASE  -- HERE IS THE PROBLEM
                            WHEN TF.trk_trackerstatus_lkid2 IS NULL THEN 0
                            ELSE 1
                          END
    
    试着把它改成

    AND ( TF.readyforwork = 0 and TF.trk_trackerstatus_lkid2 IS NULL 
       OR TF.readyforwork = 1 and TF.trk_trackerstatus_lkid2 IS NOT NULL
        )
    

    但是您应该再次检查
    解释分析
    以测试您的查询是否使用索引。

    您的问题是这种情况不能使用
    索引

    AND TF.readyforwork = CASE  -- HERE IS THE PROBLEM
                            WHEN TF.trk_trackerstatus_lkid2 IS NULL THEN 0
                            ELSE 1
                          END
    
    试着把它改成

    AND ( TF.readyforwork = 0 and TF.trk_trackerstatus_lkid2 IS NULL 
       OR TF.readyforwork = 1 and TF.trk_trackerstatus_lkid2 IS NOT NULL
        )
    

    但是,您应该再次检查EXPLAIN ANALIZE,以测试您的查询是否使用索引。

    和TF.readyforwork=CASE
    这就是问题所在吗?确实如此。我试图加粗以正确显示问题所在,但代码标记似乎会覆盖任何字体样式。您可以提供吗?使用
    --
    来指示comment@destination-数据无需输入。将使用预期的输出
    和TF.readyforwork=CASE进行编辑
    这是问题案例吗?确实如此。我试图加粗以正确显示问题所在,但代码标记似乎会覆盖任何字体样式。您可以提供吗?使用
    --
    来指示comment@destination-数据无需输入。将使用预期输出进行编辑默认查询(不带大小写)中的子查询将在不到一秒钟的时间内执行。如果我加上这个案子,我会被执行15秒以上。这让我相信,与子查询相比,case更可能是一个问题。在默认查询(没有case)中保留子查询在不到一秒钟的时间内执行。如果我加上这个案子,我会被执行15秒以上。这让我相信这更可能是一个问题的情况下,而不是subqueryeah,它做了。我的错。为癌症的帖子感到抱歉。似乎是我的一个错误,没有看到我可以使用,在某种情况下…:/是的,成功了。我的错。为癌症的帖子感到抱歉。似乎是我的一个错误,没有看到我可以使用,在某种情况下…:/