2016-11-08 142 views
0

我在处理方面遇到了问题,并且在保持其准确性的同时提高了查询效率。在我显示查询之前,我想指出一些基本知识。减少SQL查询的执行时间

我有一个案例,操纵where条款 - 获取父母的所有孩子。基本上我有两种类型的数据需要显示;红色和绿色类型。红色类型的列(TRK_TrackerGroup_LKID2)默认设置为NULL,而绿色数据在所述列中有一个值(范围从5-7)。

我的问题是,我需要提取两种类型的数据准确地得到突出问题计数的观点,但这样做(加入的情况下)的执行时间的推移,从<1秒远远超过15秒

这是查询(与提到的情况):

SELECT TS.id  AS TrackerStartDateID, 
     TSM.mappingtypeid, 
     TSM.maptoid, 
     TFLK.trk_trackergroup_lkid, 
     Count(TF.id) AS Cnt 
FROM [dbo].[trk_startdate] TS 
     INNER JOIN [dbo].[trk_startdatemap] TSM 
       ON TS.id = TSM.trk_startdateid 
        AND TSM.deletedflag = 0 
     INNER JOIN [dbo].[trk_trackerfeatures] TF 
       ON TF.trk_startdateid = TS.id 
        AND TF.deletedflag = 0 
     INNER JOIN [dbo].[trk_trackerfeatures_lk] TFLK 
       ON TFLK.id = TF.trk_feature_lkid 
WHERE TS.deletedflag = 0 
     AND TF.applicabletoproject = 1 
     AND TF.readyforwork = CASE -- HERE IS THE PROBLEM 
           WHEN TF.trk_trackerstatus_lkid2 IS NULL THEN 0 
           ELSE 1 
          END 
     AND TF.datestamp = (SELECT Max(TF2.datestamp) 
          FROM [dbo].[trk_trackerfeatures] TF2 
            INNER JOIN [dbo].[trk_trackerfeatures_lk] TFLK2 
              ON TFLK2.id = TF2.trk_feature_lkid 
          WHERE TF.trk_startdateid = TF2.trk_startdateid 
            AND TFLK2.trk_trackergroup_lkid = TFLK.trk_trackergroup_lkid) 
GROUP BY TS.id, 
      TSM.mappingtypeid, 
      TSM.maptoid, 
      TFLK.trk_trackergroup_lkid, 
      TF.datestamp 

它用作在意义上的“父”,它抓住最新插入的(使用日期戳)从每一个儿童安全数据集组。这对于在稍后的SSRS报告中生成父报告是必要的,但目前我的问题(如上所述)是执行时间。

我想听听是否有任何关于如何减少执行时间,同时保持查询的准确性的建议。

预期输出:

enter image description here

没有的情况下我得到这个:

enter image description here

+0

'和TF。readyforwork = CASE'是这个问题的情况吗? –

+0

确实。我试图大胆地说明问题是什么,但似乎代码标记覆盖了任何字体样式。 – geostocker

+0

你能提供[样本输入和期望输出](http://stackoverflow.com/help/mcve)吗? –

回答

3

您的问题是此病无法使用INDEX

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检查,如果您的查询使用索引或不进行测试。

+0

是的,这是做到了。我的错。对不起,癌症后。似乎在我的身边没有看到我可以在一个案例中使用AND的错误...:/ – geostocker

0

您查询的最棘手的一点似乎是相关子查询,因为你必须调用它适用于每一个可能的行。

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

根据您的查询我想补充这两个指标的倍数:

  1. trackerfeatures,索引字段:trk_startdateid, datestamp

  2. trk_trackerfeatures_lk,索引字段:id, trk_trackergroup_lkid

+0

在默认查询(不包含大小写)中执行子查询的时间不到一秒钟。而如果我添加案例,则执行时间超过15秒。 这导致我相信它比子查询更可能是一个问题案例 – geostocker