1. 程式人生 > 其它 >使用引數化SQL,避免即席式TSQL查詢計劃導致記憶體膨脹

使用引數化SQL,避免即席式TSQL查詢計劃導致記憶體膨脹

在SQL Server中執行程式碼時,程式碼會生成一個雜湊值,並使用雜湊值確認計劃的重用,如果執行一個儲存過程,儲存過程的名稱會生成一個雜湊值,後續的每一個儲存過程呼叫不管使用的引數是否與之前的相同,都會重用該計劃。

如果執行除了儲存過程以外的同樣的程式碼啊(也就是即席T-SQL),包含程式碼中所有文字的整段程式碼將會生成雜湊值。當改變了程式碼中的任何文字再次執行語句,新的雜湊值與之前的就不同樂,因此會生成一個新的執行計劃。

這種情況會導致被稱為計劃快取膨脹(plan cache bloat)的場景,既可能有成千上萬的即席查詢的執行計劃被生成和快取,雖然從根本上說程式碼時相同的,單這些計劃的使用次數只有1。

理想的解決方案是用時儲存過程或函式,或將所有即席T-SQL都進行引數化。

對於喜歡手寫SQL朋友來說,這真是一個不幸的事實,好在還有點輕微的補救辦法:

啟用即席優化選項(預設是關閉的)