0

我們在我們的asp.net應用程序中有很多小的SQL查詢。另外我們在數據庫中有一些存儲過程。如何使SQL語句(查詢)預編譯在SQL Server 2012中

我們無法爲每個SQL語句創建存儲過程。

如何預編譯這些SQL查詢,以便每次查詢執行時忽略編譯時間?給我們一個小例子。

+0

[這](https://msdn.microsoft.com/en-us/library/cc293623.aspx)可以幫助將大於短例子更。 –

+0

如果您的查詢不變,那麼緩存的計劃很有可能會被重用。如果您的查詢是每次調用時使用不同文本的非參數化adhoc - 那麼就沒有機會重用緩存計劃。一個完全_new_查詢如何被「預編譯」? –

回答

1

查詢預編譯的唯一方法是使用存儲過程和參數查詢。無論何時運行查詢,SQL服務器都會將編譯後的執行計劃保存在緩存中,因此如果在您的應用程序中經常使用查詢,SQL服務器會將其保留更長時間。

請注意,如果您使用臨時查詢,則不會發生這種情況。 如果query1甚至與query2不同,則SQL假定它們是2個不同的查詢。

因此儘可能多地使用參數查詢。這也有助於防止SQL注入。

對於更多結構化的db編程,最好使用存儲過程。 SP的行爲就像參數查詢,並且實際上阻止您使用即席查詢。

你可以找到在網絡上的許多文章,如果你搜索一下「SQL Sever的執行計劃緩存」

如果你需要這些東西瞭解不深,讀過這本書:

微軟SQL Server 2012和的內幕

此鏈接爲您提供更深入的信息。

Chaching Mechanisms

+1

甚至SQL Server中的存儲過程也不是「預編譯」的 - 它們的執行計劃是在第一次執行時確定的 - 就像使用臨時SQL查詢一樣 - 併爲後續執行而緩存。參見[預編譯的存儲過程 - 事實還是神話?](http://www.scarydba.com/2009/09/30/pre-compiled-stored-procedures-fact-or-myth/) –

+0

@marc_s,You是對的。我並不是說SQL服務器在執行它們之前編譯rpocs。它在第一次執行時編譯它們,然後保存執行計劃,如參數查詢。存儲過程有更多的機會留在緩存而不是查詢中,因爲它們的簽名保持不變(如參數查詢)。如果我錯了,請糾正我。謝謝 – FLICKER

+2

同樣,存儲過程和**正確參數化的即席查詢的執行計劃的** SAME CHANCE **被保存在內存中。但是,如果查詢不*參數化,當然會給計劃緩存帶來更多壓力,因此計劃可能會更快地被推出 - 但存儲過程計劃與臨時查詢計劃之間沒有區別 - 最老的(最少使用)計劃先走 –