2012-01-24 143 views
5

我有幾個關於Microsoft SQL Server 2008性能的問題,主要是關於執行計劃。SQL執行計劃緩存

據,以MSDN,相比直接的SQL查詢存儲過程中有更好的表現,這是因爲:

數據庫可以準備,優化和緩存的執行計劃,使執行計劃可以在被重用晚點。

我的第一個問題是爲什麼會出現這種情況。我以前讀過使用參數化查詢(預準備語句)時,執行計劃被緩存以用於具有可能不同的值(執行上下文)的後續執行。存儲過程是否仍然更高效?如果是這樣,一個存儲過程的執行計劃是否只是按需重新創建,還是不太可能從緩存中清除?是否將參數化查詢視爲ad-hoc query,這意味着執行計劃更可能從緩存中清除?

此外,由於我仍然是這個領域的新手,我想知道是否有某些命令只能在T-SQL中工作。我有一個查詢需要大約12秒才能完成第一次運行,然後在〜3秒之後,在Microsoft SQL Management Studio和ADO.NET中完成。作爲我的演示文稿的一部分,查詢應該是無效的。問題是,在我的查詢中,我使用CHECKPOINTDBCC DROPCLEANBUFFERS,this articleOPTION (RECOMPILE)。但是,至少前兩個似乎沒有什麼區別,因爲查詢仍然需要3秒。我的猜測是,這是由於數據緩存未被清除。任何想法爲什麼緩存似乎沒有被清除,或者有關爲什麼我的查詢在第一次執行後顯着更快的想法?

這些是我現在可以想到的問題。

+2

好問題 - 我會將這篇文章分成幾篇文章,也許有一篇關於存儲過程與參數化查詢的問題,一篇文章針對查詢的多次運行等等。 –

+0

也許你是對的;我的腦海裏想着不要垃圾郵件。 :-) – Andy0708

+0

stackoverflow的想法是保持焦點的問題,以便反過來也可以集中答案 - 所以不要擔心加載一堆問題的網站 –

回答

3

「存儲過程是否仍然更高效?」:基本上沒有。它節省很少。從性能的角度來看,你幾乎可以在你的應用中使用SQL文字(除非它們很大)。 SQL Server會將您發送給它的字符串與緩存計劃匹配得很好。

「我有一個查詢需要大約12秒才能完成第一次運行,然後在〜3秒後」考慮到您清除了所有緩存,這可能是一個統計問題。第一次訪問列時,SQL Server會自動創建統計信息。我想這就是曾經發生過的事情。嘗試運行sp_updatestats(清除緩存之前)。

+0

做您知道存儲過程和參數化查詢的執行計劃是否在緩存中以相同的方式「處理」?我的意思是如果一個人比另一個更容易被沖洗。清除統計數據似乎沒有太大影響。 – Andy0708

+0

我不認爲他們有不同的潮紅特徵。只有在記憶短暫的情況下才會發生衝突,所以這可能對你無關緊要。 – usr

+0

爲了性能的原因保持sprocs中的所有代碼真的很過時。 – usr