Performance

找出哪些查詢會受到對 CTFP 的擬議變更的影響

  • May 6, 2022

我們其中一台伺服器上的並行設置的成本門檻值設置為通常被認為太低的值 (15),我們正在考慮將其增加到 50,以希望在 CPU 變高時減少它。

我想知道哪些查詢會受到影響,以便我們可以對它們進行一些測試和監控。

我解決這個問題的方法是查詢計劃記憶體(並解析 XML)。儘管使用計劃記憶體存在問題(計劃在記憶體壓力下過期/拋出,伺服器重新啟動等)這是解決此問題的最佳方法嗎?

我的查詢是

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT  p.query_plan.value('(/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@StatementSubTreeCost)[1]','FLOAT') AS QueryCost ,
       t.text
FROM    sys.dm_exec_query_stats s
       CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) t
       CROSS APPLY sys.dm_exec_query_plan(s.plan_handle) p
WHERE   p.query_plan.value('(/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@StatementSubTreeCost)[1]','FLOAT') > 15 AND
       p.query_plan.value('(/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/@StatementSubTreeCost)[1]','FLOAT') <= 50 

由於您使用的是 SQL Server 2016,因此我建議您在使用者數據庫上啟用查詢儲存。您可以使用上面相同的查詢,但指向**sys.query_store_plan** DMV 而不是計劃記憶體來獲取和詢問查詢計劃 XML。

使用查詢儲存可確保您的計劃被持久化,並且可能會比記憶體保留它們的時間更長。查詢儲存還允許您分析查詢的其他元素以幫助確定潛在影響。由於 DMV 具有is_parallel_plan列,因此它還可以更輕鬆地辨識並行計劃,您可以使用該列僅辨識那些並行成本門檻值之間的查詢。

然後,您還可以在對 CTFP 進行任何更改後輕鬆辨識查詢回歸。這意味著如果您在更改後僅辨識少數回歸,您可能會在優化串列執行查詢時強制使用舊的並行計劃,並且更改 CTFP 並將其回滾不會強制執行這些計劃重新編譯並可能從記憶體中刷新。

它與提高數據庫的兼容性級別時建議的基本原則相同,這使您可以輕鬆設置基線,然後在更改後辨識回歸。

引用自:https://dba.stackexchange.com/questions/311740