我有(用於一些奇怪的原因)結束了一個視圖需要約30秒編譯,但< 3秒運行。重複使用執行計劃查詢與不同的WHERE子句的視圖
這是一個視圖,坐在一大堆嵌套視圖的頂部,每個嵌套視圖都有許多層序的CTE。底層數據集並不是那麼大,我想象的是爲什麼查詢最終運行速度非常快。
如果我們總是閱讀整個表格,那很好 - 第一個查詢會很慢,而且以後每次點擊都會很好。 不幸的是,訪問代碼將要用日期窗口讀取它。
SELECT * FROM myView WHERE date BETWEEN 'foo' AND 'bar'
您運行的第一次,它需要30秒編譯Exec的計劃;第二次運行1-3秒。
是否有防止重新編譯? 我認識到它可能會導致最終的執行計劃效率不高,因爲它針對不同的子句進行了優化,但數據非常均勻,所以我不希望它太糟糕,並且30秒的編譯時間是太痛苦了。
我已經通過像thesepages頁看了。但沒有太多的立即跳出作爲我有關的,並沒有似乎並沒有達到我的目標(雖然我可以很容易地錯過了一些東西)位
編輯:
STATISTICS TIME ON
輸出對於一個類似的視圖,需要約6分鐘才能在寒冷的時候運行,或者在預編譯時運行約1/2秒(實際上,具體來說,它是從嵌套中的一層下來的視圖中的一個視圖)。
SELECT * FROM myView WHERE date_incurred < '2017-02-20'
Run with param = '2017-02-20'
SQL Server parse and compile time: CPU time = 5008 ms, elapsed time = 5184 ms.
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
(77 row(s) affected)
SQL Server Execution Times: CPU time = 452 ms, elapsed time = 772 ms.
Run with param = '2017-02-20'
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
(77 row(s) affected)
SQL Server Execution Times: CPU time = 437 ms, elapsed time = 582 ms.
Run with param = '2017-02-21'
SQL Server parse and compile time: CPU time = 4618 ms, elapsed time = 4877 ms.
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
(79 row(s) affected)
SQL Server Execution Times: CPU time = 359 ms, elapsed time = 643 ms.
Run with param = '2017-02-21'
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
(79 row(s) affected)
SQL Server Execution Times: CPU time = 483 ms, elapsed time = 559 ms.
像這樣的嵌套查詢是性能時間炸彈。看看這裏有關嵌套意見的恐怖。 https://www.simple-talk.com/sql/performance/the-seven-sins-against-tsql-performance/#seven –
你的估計編譯時間如何。你可以粘貼'set statistics time on'的輸出爲不同的情況 – TheGameiswar
所以我估計它是基於查詢在窗口中的執行時間,當它非常嚴重時很容易判斷差異:)將提供STATS數據。 – Brondahl