2016-11-08 193 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