延續前文:Interleaved execution for multi-statement table valued functions(交錯執行多重陳述式資料表值函式)
Compare MSTVF with InlineTVF:
- Actually, Execution plan of Inline TVF is the same as Ad hoc Query.
- Without side effect of Parameter Sniffing.
- If the Multi-Statement TVF is single statement only, convert to Inline TVF.
建議:
如果 MSTVF 內只包含單一 SQL Query,請轉換為 Inline TVF。
- Inline TVF 的 Execution Plan 相同於 Ad hoc Query 的 Execution Plan。
- 沒有 Parameter Sniffing 的副作用。
- 反映精確的基數估計值,顯示精確的資料列筆數。
- 協助 Query Optimizer 選擇有效率的 Index。
- 選擇 合適且有效率的 Join Algorithms。
Execution plan of Inline TVF is the same as Ad hoc Query
InlineTVF - Inline Table-Valued Function.
01. 建立 Table-Valued Function: ufn_GetCity_InlineTVF
- 只包含單一 SQL Query。
- 功能與先前建立的 MSTVF 相同:ufn_GetCity_CE 與 ufn_GetCity_Join。
-- figure 01_CREATE FUNCTION_ufn_GetCity_InlineTVF
02. 執行 Inline TVF,設定 StateProvinceID 值為 32,觀察 Execution Plan:
- 使用 Live Query Statistics,可以觀察各個 Operator 的傳回資料列筆數。
- 相同於 Ad hoc Query ,顯示 Execution Plan,沒有 Parameter Sniffing 的副作用。
- 都是 1 row。
- Index Seek_[IX_Address_StateProvinceID]。
-- figure 11_Return 1 row, Index Seek_[IX_Address_StateProvinceID]
03. Estimated Number of Rows 回傳 1。
-- figure 12_Estimated Number of Rows
04. 執行 Inline TVF,設定 StateProvinceID 值為 9,觀察 Execution Plan:
- 相同於 Ad hoc Query ,顯示 Execution Plan,沒有 Parameter Sniffing 的副作用。
- 4564 row。
- Index Scan: [IX_Address_AddressLine1_AddressLine2_City_StateProvinceID_PostalCode]。
-- figure 21_Return 4564 rows Index Scan
05. Estimated Number of Rows: 4564。
-- figure 22_Estimated Number of Rows
06. 使用 Plan Explorer 觀察:
- Est Rows 與 Actual Rows 皆能精確顯示,協助 Query Optimizer 選擇有效率的 Index。
-- figure 31_Plan_Explorer
07. 使用 DMV 觀察 Performance Data:
- ObjType 都是 Adhoc。
-- figure 32_View_Performance_Data
08. 將 Inline TVF 應用於 Table Join 的 Query:
- 相同於 Ad hoc Query ,顯示 Execution Plan,沒有 Parameter Sniffing 的副作用。
- Index Seek: [IX_Address_StateProvinceID]。
- 觀察各個 Operator 的傳回資料列筆數,顯示精確的資料列筆數。
- 協助 Query Optimizer 選擇有效率的 Index 以及 選擇 合適且有效率的 Join Algorithms: Merge Join(Inner Join)。
-- figure 41_Return 5884 rows Merge Join(Inner Join)
-- figure 42_Plan_Explorer
-- figure 43_View_Performance_Data
Sample Code
20180331_InlineTVF_Adhoc
https://drive.google.com/drive/folders/0B9PQZW3M2F40OTk3YjI2NTEtNjUxZS00MjNjLWFkYWItMzg4ZDhhMGIwMTZl?usp=sharing
References
Post-migration Validation and Optimization Guide
https://docs.microsoft.com/en-us/sql/relational-databases/post-migration-validation-and-optimization-guide
SQL 資料庫中的彈性查詢處理 (Adaptive query processing in SQL databases)
https://docs.microsoft.com/zh-tw/sql/relational-databases/performance/adaptive-query-processing
[SQL Server] Parameter sniffing occurs with Multi-Statement Table-Valued Function
http://sharedderrick.blogspot.tw/2018/03/sql-server-parameter-sniffing-occurs.html
[SQL Server] Multi-Statement Table-Valued Function have a fixed Cardinality Estimation value
http://sharedderrick.blogspot.tw/2018/03/sql-server-multi-statement-table-valued.html
[SQL Server] Interleaved execution for multi-statement table valued functions
http://sharedderrick.blogspot.tw/2018/03/sql-server-interleaved-execution-for.html
沒有留言:
張貼留言