Query Store是SQL Server 2016中引入的語句性能監控和調優工具,它不只自動捕獲查詢、執行計劃和運行時統計信息的歷史記錄,並且還能夠識別出因爲執行計劃更改而致使的性能差別,簡化了性能故障排除的流程。Query Store從字面意思上來解釋,它是查詢的倉庫,它使用異步更新方式,把數據存儲到硬盤(Disk)中。sql
Query Store默認是關閉的,啓用Query Store對查詢性能仍是有必定的影響的,數據庫
ALTER DATABASE { database_name | CURRENT } SET QUERY_STORE { = OFF | = ON [ ( <query_store_option_list> [,...n] ) ] | CLEAR [ ALL ] } <query_store_option_list> ::= { OPERATION_MODE = { READ_WRITE | READ_ONLY } | CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = number ) | DATA_FLUSH_INTERVAL_SECONDS = number | MAX_STORAGE_SIZE_MB = number | INTERVAL_LENGTH_MINUTES = number | SIZE_BASED_CLEANUP_MODE = { AUTO | OFF } | QUERY_CAPTURE_MODE = { ALL | AUTO | CUSTOM | NONE } | MAX_PLANS_PER_QUERY = number | WAIT_STATS_CAPTURE_MODE = { ON | OFF } | QUERY_CAPTURE_POLICY = ( <query_capture_policy_option_list> [,...n] ) } <query_capture_policy_option_list> :: = { STALE_CAPTURE_POLICY_THRESHOLD = number { DAYS | HOURS } | EXECUTION_COUNT = number | TOTAL_COMPILE_CPU_TIME_MS = number | TOTAL_EXECUTION_CPU_TIME_MS = number }
參數註釋:緩存
例如,使用默認值來啓用Query Store:架構
ALTER DATABASE [QueryStoreDB] SET QUERY_STORE = ON ( OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ), DATA_FLUSH_INTERVAL_SECONDS = 900, MAX_STORAGE_SIZE_MB = 1000, INTERVAL_LENGTH_MINUTES = 60, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON, QUERY_CAPTURE_MODE = CUSTOM, QUERY_CAPTURE_POLICY = ( STALE_CAPTURE_POLICY_THRESHOLD = 24 HOURS, EXECUTION_COUNT = 30, TOTAL_COMPILE_CPU_TIME_MS = 1000, TOTAL_EXECUTION_CPU_TIME_MS = 100 ) );
用戶能夠經過系統視圖來查看各個選項的配置狀況:異步
sys.database_query_store_optionside
用戶也可使用SSMS來對Query Store的各個選項進行配置:工具
Query Store包含四個Store,分別是query store、plan store、runtime stats store和wait stats store。query store 用於捕獲查詢的信息,plan store用於捕獲執行計劃的信息,runtime stats store用於捕獲執行計劃的變動記錄和統計信息等,stats store 用於捕獲等待統計信息。性能
1,計劃強制(Plan Forcing)優化
因爲一些不可預知的緣由,例如統計信息更改,架構更改,索引的建立/刪除等,SQL Server中任意一個查詢的執行計劃一般都會隨着時間的推移而變化。因爲內存壓力,計劃也會從計劃緩存中逐出,這致使計劃緩存只存儲查詢的最新的執行計劃。由執行計劃更改引發的查詢性能的降低,就無跡可尋,解決起來很費時間。lua
因爲Query Store爲每一個查詢保留多個執行計劃,所以,它能夠指示查詢處理器(Query Processor)對查詢強制使用特定的執行計劃,這稱爲計劃強制(Plan Forcing)。Query Store中的計劃強制(Plan Forcing)的工做相似於USE PLAN查詢提示的機制,可是不須要在用戶在應用程序中作任何更改,計劃強制能夠在很短的時間內解決由計劃更改致使的查詢性能降低的問題。
2,等待統計(Wait Stats)
等待統計信息是解決查詢性能問題的另外一信息來源,長期以來,等待統計信息僅在實例級別可用,這使得很難將等待回溯到特定查詢語句上。 從SQL Server 2017(14.x)和 Azure SQL數據庫開始,查詢存儲可以追蹤特定語句的等待信息。
ALTER DATABASE AdventureWorks2012 SET QUERY_STORE = ON ( WAIT_STATS_CAPTURE_MODE = ON );
在啓用Query Store以後,刷新SSMS的Object Explorer面板,會發現,SSMS新增長了一個Query Store的目錄,這是SSMS爲了方便用戶查詢而內置的查詢界面:
以迴歸查詢(Regressed Queries)來舉例,Regressed Queries面板顯示的是查詢和相應的Plan,從Metric列表中選擇須要顯示的度量:
Query Store相關的視圖分爲四類:Query、Plan、Runtime Stats和Wait Stats。注意,Wait Stats 是從SQL Server 2017(14.x)開始支持的。
1,關於Query的信息
query的惟一標識字段是query_id
select q.query_id ,t.query_text_id ,t.query_sql_text ,q.object_id as parent_object ,q.is_internal_query ,q.query_parameterization_type ,q.query_parameterization_type_desc ,q.count_compiles ,q.avg_compile_duration ,q.avg_bind_cpu_time ,q.avg_bind_duration ,q.avg_compile_memory_kb ,q.avg_optimize_cpu_time ,q.avg_optimize_duration from sys.query_store_query as q inner join sys.query_store_query_text as t on q.query_text_id = t.query_text_id ;
2,關於Plan的信息
plan關聯的query,能夠經過字段query_id來關聯
select p.plan_id ,p.query_id ,t.query_sql_text ,p.query_plan ,p.is_parallel_plan ,p.is_forced_plan ,p.force_failure_count ,p.last_force_failure_reason ,p.last_force_failure_reason_desc ,p.count_compiles ,p.avg_compile_duration from sys.query_store_plan p inner join sys.query_store_query q on p.query_id=q.query_id inner join sys.query_store_query_text t on q.query_text_id=t.query_text_id
3,關於Plan 的 Runtime 統計
runtime stats經過plan_id 關聯到特定的query
select r.runtime_stats_id ,r.plan_id ,r.runtime_stats_interval_id ,i.start_time as interval_start_time ,i.end_time as interval_end_time ,r.execution_type ,r.execution_type_desc ,r.count_executions ,r.avg_duration ,r.avg_cpu_time ,r.avg_dop ,r.avg_logical_io_reads ,r.avg_logical_io_writes ,r.avg_physical_io_reads ,r.avg_query_max_used_memory ,r.avg_rowcount from sys.query_store_runtime_stats r inner join sys.query_store_runtime_stats_interval i on r.runtime_stats_interval_id=i.runtime_stats_interval_id
4,關於等待的統計信息
該視圖統計的等待是跟單個執行計劃有關的
select w.wait_stats_id ,w.plan_id ,w.runtime_stats_interval_id ,w.wait_category ,w.wait_category_desc ,w.execution_type ,w.execution_type_desc ,w.avg_query_wait_time_ms ,w.min_query_wait_time_ms ,w.max_query_wait_time_ms from sys.query_store_wait_stats w inner join sys.query_store_plan p on w.plan_id=p.plan_id
參考文檔: