首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 查詢記憶體消耗分析 (1/2):非參數化查詢導致計畫快取膨脹

     編輯:關於SqlServer

問題背景

應用程式常犯錯誤:使用非參數化的特設查詢而非準備好的查詢或預存程序。這會導致 SQL Server 計畫快取中累積大量無法重用的執行計畫。

計畫快取機制

計畫快取位於共享記憶體池,儲存解析、編譯、優化後的查詢執行計畫。重用計畫可節省 CPU 密集型工作(解析、編譯、優化),降低回應時間與 CPU 壓力。

實測:非參數化查詢

Java 程式迴圈執行 20 筆非參數化查詢:

String sql = "SELECT * FROM SalesOrderHeader WHERE SalesOrderID = " + id;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);

查詢 sys.dm_exec_cached_plans 發現每次執行都產生一個具體、無參數化的計畫,usecounts = 1,幾乎無法重用。高頻應用下記憶體會迅速耗盡。

DMV 查詢

SELECT qs.usecounts, cacheobjtype, objtype, qt.text
FROM sys.dm_exec_cached_plans qs
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) AS qt
ORDER BY qt.text;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved