4

我有一個查詢運行從一個Delphi應用程序,突然開始超時後運行完好幾個月後超時。進一步,當運行時,它會降低服務器的爬行留下的其他用戶認爲系統已經崩潰 從Management Studio中運行我停止查詢5分多鐘紡 服務器ID SQLEXPRESS 2008 R2查詢工作幾個月現在超時

的現在得罪查詢後

SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 365)) 

爲了讓這裏有趣的是所需時間&行返回時,我只是改變的天數回。活動監視器似乎沒有顯示超過查詢運行

SELECT  * 
FROM  SignelOutilsListeJobs_View4 -- 00.00.02 38882 ROWS 

SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 600)) -- 00.00.02 16217 ROWS 


SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 500)) -- 00.00.02 13013 ROWS 


SELECT  * 
FROM  SignelOutilsListeJobs_View4 
WHERE  (CreatedDate > (GETDATE() - 200)) -- 00.00.12 4118 ROWS 

因此,我想知道這裏發生了什麼?有任何想法嗎?

感謝

+0

第一個猜測:一個壞的查詢計劃已經得到緩存該查詢。 –

+0

...爲什麼不直接在Delphi代碼中預先計算日期限制,然後將其作爲查詢參數傳遞?它可能不太容易出錯,允許輕鬆地重複使用具有各種偏移量的相同單個語句,並且還與所有數據庫後端兼容... –

+1

不是性能挑戰的答案,但應該使用DATEADD而不是數學快捷方式。很明顯你在做什麼,不依賴於可能改變的違約行爲。 DATEADD(day,-200,getdate()) –

回答

1

GETDATE (Transact-SQL)

使用SWITCHOFFSET與函數GETDATE()可能會導致因爲查詢優化器是無法獲得的GETDATE值準確基數估計查詢運行緩慢。我們建議您預先計算GETDATE值,然後在查詢中指定該值,如以下示例所示。另外,使用OPTION(RECOMPILE)查詢提示強制查詢優化器在下次執行相同查詢時重新編譯查詢計劃。然後,優化器將對GETDATE()進行準確的基數估計,並生成更高效的查詢計劃。

換句話說,你可以嘗試編輯查詢,如下所示:

SELECT * 
FROM SignelOutilsListeJobs_View4 
WHERE CreatedDate > (GETDATE() - 200) OPTION (RECOMPILE) 

作爲替代上面,你可以考慮在視圖中創建一個唯一聚集索引

CREATE UNIQUE CLUSTERED INDEX SignelOutilsListeJobs_unique_index1 
ON SignelOutilsListeJobs_View4 (CreatedDate, <some unique key>) 

從微軟的TechNet:

+0

我嘗試了以下三個版本導致了同樣的結果的查詢,請注意,我停止了查詢等待一分鐘後,用戶對我的門敲 前 - SELECT * FROM SignelOutilsListeJobs_View4 WHERE(CreatedDate>(GETDATE( ) - 365))OPTION(RECOMPILE) - SELECT * FROM SignelOutilsListeJobs_View4 WHERE(CreatedDate> DATEADD(日,-365,GETDATE()))OPTION(RECOMPILE) - 聲明ADATE日期-AT CHAR除去POST SET ADATE = GETDATE() - 365 SELECT * FROM SignelOutilsLi steJobs_View4 WHERE(CreatedDate> @ADATE)選項(RECOMPILE) – Marc