2017-10-17 52 views
1

這是一個更多的測驗問題,而不是我在最後期限內驚慌失措,但是理解如何/爲什麼毫無疑問會讓我輕輕地抓我的頭!爲什麼我得到這個意外的SQL性能增益?

所以我有這樣的UPDATE語句:

/*** @Table is a TABLE Variable ***/ 
UPDATE O 
SET O.PPTime = T.PPTime 
FROM @Table AS [O] 
INNER JOIN 
    (SELECT O.OSID, O.STID, DATEDIFF(SECOND, O.StartDateTime, O.EndDateTime) AS [PPTime] 
     FROM tblO AS [O] 
     INNER JOIN tblS AS [S] ON O.OSID = S.OSID 
     INNER JOIN tblE AS [E] ON S.EID = E.EID 
     INNER JOIN tblEF AS [EF] ON E.EFID = EF.EFID 
     GROUP BY O.OSID, O.STID, O.StartDateTime, O.EndDateTime) AS [T] 
ON O.OSID = T.OSID 
WHERE O.PPTime IS NULL 

的執行時間約爲12秒。

現在下面我在一個小凡不具備對數據的多少行造成任何影響語句中返回給用戶增加了:

/*** @Table is a TABLE Variable ***/ 
UPDATE O 
SET O.PPTime = T.PPTime 
FROM @Table AS [O] 
INNER JOIN 
    (SELECT O.OSID, O.STID, DATEDIFF(SECOND, O.StartDateTime, O.EndDateTime) AS [PPTime] 
     FROM tblO AS [O] 
     INNER JOIN tblS AS [S] ON O.OSID = S.OSID 
     INNER JOIN tblE AS [E] ON S.EID = E.EID 
     INNER JOIN tblEF AS [EF] ON E.EFID = EF.EFID 
     WHERE O.OSID >= 0  /*** Somehow fixes performance slow down! ***/ 
     GROUP BY O.OSID, O.STID, O.StartDateTime, O.EndDateTime) AS [T] 
ON O.OSID = T.OSID 
WHERE O.PPTime IS NULL 

執行時間現在不到一秒鐘。如果我單獨運行兩個SELECT語句,它們將在同一時間執行並返回相同的數據。

爲什麼我會得到這樣的性能增益?

+4

這是因爲優化程序在更好的執行計劃中發現了一個錯誤。一種可能性是被使用的索引。更有可能的是,查詢不再進行嵌套循環連接。您需要查看執行計劃以瞭解正在發生的事情。 –

+4

如果您檢查實際執行計劃,您會看到查詢優化程序爲每種情況選擇了哪些運算符。也許它會有意義然後:) –

+2

對這兩個查詢運行'EXPLAIN',我的猜測是你會在報告中看到明顯的東西。 –

回答

0

在回顧了代碼之後,我注意到向表變量添加主鍵和/或索引完成了訣竅!一個讓我記住!