延續前一篇 [SQL Server] Enable optimize for ad hoc workloads , 針對特定工作負載最佳化
在 SQL Server 中執行任何 SQL 陳述式時,關聯式引擎會先尋找整個 Plan Cache,確認是否已經有相同的 SQL 陳述式之 Execution Plan。
- 如果有找到,就可以重複使用,節省重新編譯 SQL 陳述式的負擔。
- 如果沒有找到,SQL Server 會為該 SQL 陳述式建立新的 Execution Plan。
比對方式 - hash value
SQL Server 會為每一個 SQL 陳述式建立 hash value,以此 hash value 比對另一 SQL 陳述式的 hash value 是否相同。
- 若 hash 值 相同,就能重複使用該 SQL 陳述式所建立 Execution Plan。
- 若 hash 值 不同,就必須為該 SQL 陳述式編譯新的 Execution Plan。
這裡所指的 SQL 陳述式,包含:Ad hoc Query, Stored Procedure 等。
也就是說,要能重複使用 Execution Plan,則執行的 Ad hoc Query 必須完全相同。舉例來說,這包含了:空白、註解、大小寫、結尾符號、SET 選項 等。
要完全一模一樣的 Ad hoc Query,才能重複使用 Execution Plan。
Demo: Ad hoc Query and Reuse
01. 執行 Ad hoc Query
以下有 7 個 Ad hoc Query,前 6 個回傳相同結果。
第 7 個陳述式,僅改變 WHERE 條件式中的 OrderID=2。
-- 101_Adhoc Query
02. 第一次執行 Ad hoc Query,觀察:
- 有 5 個 Ad hoc query,判斷為無法重複使用 Execution Plan,其 Cache Object 都是Compiled Plan,個別都使用了 16 KB。
- 僅有 1 個 Ad hoc query,判斷為可以重複使用 Execution Plan,其 Cache Object 是完整的 Compiled Plan,使用 16 KB。
-- 102_View each cached query execution plan
-- 103_View each cached query execution plan
03. 啟用「optimize for ad hoc workloads」
- 無須重新啟動 SQL Server。
- 將 optimize for ad hoc workloads 設定為 1 只會影響新的計畫。
- 已經存在計畫快取中的計畫則不會受到影響。
-- 104_Enable optimize for ad hoc workloads
04. 觀察 Ad hoc query
- 有 5 個 Ad hoc query,判斷為無法重複使用,其 Cache Object 都是「compiled plan stub(已編譯計畫虛設常式)」,個別僅使用 0.125 KB。
- 僅有 1 個 Ad hoc query,判斷為可以重複使用 Execution Plan,其 Cache Object 是完整的 Compiled Plan,使用 16 KB。
- 啟用 optimize for ad hoc workloads 後,SQL Server 在編譯 Adhoc query 時,採取 「compiled plan stub(已編譯計畫虛設常式)」 方式,耗用少量的 Plan Cache 資源。
-- 105_View each cached query execution plan
範例程式碼
20171110_Ad hoc Query and Reuse
https://drive.google.com/drive/folders/1iPrZdHHk812HumTcYJVSlbtZSTE9cDjO?usp=sharing
參考資料
[SQL Server] Enable optimize for ad hoc workloads , 針對特定工作負載最佳化
http://sharedderrick.blogspot.tw/2017/11/sql-server-enable-optimize-for-ad-hoc.html
Plan Cache Internals
https://msdn.microsoft.com/en-us/library/cc293624.aspx
[SQL Server] Plan Cache concepts - 認識 Plan Cache
http://sharedderrick.blogspot.tw/2017/11/sql-server-plan-cache-concepts-plan.html
針對特定工作負載最佳化伺服器組態選項
https://docs.microsoft.com/zh-tw/sql/database-engine/configure-windows/optimize-for-ad-hoc-workloads-server-configuration-option
Execution Plan Caching and Reuse - 執行計畫快取與重複使用
https://technet.microsoft.com/zh-tw/library/ms181055(v=sql.105).aspx
sys.dm_exec_cached_plans (Transact-SQL)
https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-cached-plans-transact-sql
Plan cache and optimizing for adhoc workloads
https://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/
Plan cache, adhoc workloads and clearing the single-use plan cache bloat
沒有留言:
張貼留言