2015-11-04 50 views
0

我想加快這個查詢,我試着各種連接,但我似乎無法結束與storm2 = 1和storm2 = 2重複查詢一個加入替換SQL服務器子查詢,使查詢更快,而不是抓取

SELECT v1.id 
    ,v1.StormOut 
    ,v1.StormNo 
    ,v1.StormYes 
    ,v1.Equipment 
    ,(
     SELECT TimeOn 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS TimeOn 
    ,v1.Vehicle 
    ,v1.NAME 
    ,v1.Equipment AS Equip 
    ,(
     SELECT ScheduleOrig 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS ScheduleOrig 
    ,(
     SELECT ScheduleHTML 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS ScheduleHTML 
    ,(
     SELECT Schedule 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS Schedule 
    ,(
     SELECT TimeOff 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS TimeOff 
    ,v1.StormTimeOn 
    ,v1.StormTimeOff 
    ,v1.StormOut AS 'Out' 
    ,v1.StormYes AS Yes 
    ,v1.StormNo AS No 
    ,(
     SELECT comments 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS comments 
    ,v1.StormComments 
    ,(
     SELECT Comments 
     FROM [v_StormLog] 
     WHERE vehicle = v1.Vehicle 
      AND Storm2 = 1 
      AND CurrentDate = v1.CurrentDate 
     ) AS CommentsHTML 
    ,v1.Storm2 
FROM [v_StormLog] v1 
WHERE DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date 
    AND v1.sgroup = 'North' 
    AND v1.Storm2 = @storm2 
ORDER BY v1.ScheduleHTML 
    ,v1.NAME 
+1

至少向我們展示執行計劃http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan –

回答

1

如果我記得沒錯,子查詢的這種風格被轉換到一個OUTER JOIN,但你應該檢查你的執行計劃以確保。假如是這樣的話:

SELECT v1.id 
    ,v1.StormOut 
    ,v1.StormNo 
    ,v1.StormYes 
    ,v1.Equipment 
    ,v2.TimeOn AS TimeOn 
    ,v1.Vehicle 
    ,v1.NAME 
    ,v1.Equipment AS Equip 
    ,v2.ScheduleOrig AS ScheduleOrig 
    ,v2.ScheduleHTML AS ScheduleHTML 
    ,v2.Schedule AS Schedule 
    ,v2.TimeOff AS TimeOff 
    ,v1.StormTimeOn 
    ,v1.StormTimeOff 
    ,v1.StormOut AS 'Out' 
    ,v1.StormYes AS Yes 
    ,v1.StormNo AS No 
    ,v2.comments AS comments 
    ,v1.StormComments 
    ,v2.Comments AS CommentsHTML 
    ,v1.Storm2 
FROM [v_StormLog] v1 
LEFT JOIN [v_StormLog] v2 
    ON v2.vehicle = v1.Vehicle 
    AND v2.CurrentDate = v1.CurrentDate 
    AND v2.Storm2 = 1 
WHERE v1.[CurrentDate] >= @Date 
    AND v1.[CurrentDate] < DATEADD(dd,@Date,1) 
    AND v1.sgroup = 'North' 
    AND v1.Storm2 = @storm2 
ORDER BY v1.ScheduleHTML 
    ,v1.NAME 

此外,這是不好的:DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date。您正在告訴數據庫加載每個日期時間值並在其上執行此功能,然後將其與固定值進行比較。你想避免這種情況。你想要針對靜態值運行你的函數。在這裏,@Date顯然是以00:00作爲時間分量的日期時間值。所以,在這種情況下,你可以做這樣的:

v1.[CurrentDate] >= @Date 
AND v1.[CurrentDate] < DATEADD(dd,@Date,1) 

這意味着「的currentdate是或@date後@date後一天的午夜之前」。

1

你需要自己加入表格。這會減少內部選擇的數量。你還應該檢查有適當的索引中查找的執行計劃

SELECT v1.*, v2.*  -- update using the fields you need 
FROM [v_StormLog] v1 
JOIN [v_StormLog] v2 
    ON v2.vehicle = v1.Vehicle  
AND v2.CurrentDate = v1.CurrentDate 
WHERE 
    DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date 
AND v1.sgroup = 'North' 
AND v1.Storm2 = @storm2  
AND v2.Storm2 = 1 

你也已經重複場

,v1.StormOut 
,v1.StormNo 
,v1.StormYes 

而且

,v1.StormOut AS 'Out' 
,v1.StormYes AS Yes 
,v1.StormNo AS No