使用Query Store監控性能

Query Store是SQL Server 2016中引入的語句性能監控和調優工具,它不只自動捕獲查詢、執行計劃和運行時統計信息的歷史記錄,並且還能夠識別出因爲執行計劃更改而致使的性能差別,簡化了性能故障排除的流程。Query Store從字面意思上來解釋,它是查詢的倉庫,它使用異步更新方式,把數據存儲到硬盤(Disk)中。sql

一,啓用Query Store

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
}
View Code

參數註釋:緩存

  • CLEAR:清空Query Store的內存
  • OPERATION_MODE:READ_WRITE是指Query Store會持續收集和持久化查詢計劃(query plan)和運行時的執行統計信息,而READ_ONLY是指只能從Query Store讀取信息,而不會更新Query Store。
  • CLEANUP_POLICY:定義數據留存的時間窗口,超過該窗口,過時的數據從Query Store中清理出去。
  • DATA_FLUSH_INTERVAL_SECONDS:定義數據持久化到硬盤的頻率,默認值是900s(15min)。爲了優化性能,Query Store收集的數據採用異步寫方式,每隔必定的時間會把捕獲的數據寫到硬盤中。
  • MAX_STORAGE_SIZE_MB:設置Query Store的最大存儲空間。若是Query Store達到最大存儲空間限制,Query Store會把操做模式(OPERATION_MODE)更改成READ_ONLY
  • INTERVAL_LENGTH_MINUTES:每隔必定的時間窗口對運行時的執行統計數據進行聚合,而後把聚合值存儲到Query Store中。
  • SIZE_BASED_CLEANUP_MODE :基於Query Store佔用的空間大小控制是否啓動清理程序,清理程序會自動刪除Query Store中過期的數據,以釋放Query Store的空間
  • QUERY_CAPTURE_MODE :定義捕獲查詢的捕獲模式,默認值是ALL,表示捕獲全部的查詢,AUTO表示基於執行次數和資源消耗來捕獲相關的查詢。
  • MAX_PLANS_PER_QUERY:定義爲每一個查詢維護的計劃數量,默認值是200
  • WAIT_STATS_CAPTURE_MODE :是否捕獲等待統計(wait stats)
  • QUERY_CAPTURE_POLICY:定義捕獲Query的策略,
    • STALE_CAPTURE_POLICY_THRESHOLD :定義評估的時間間隔(evaluation interval period ),根據如下的選項來肯定是否一個query應該被捕獲,evaluation period的默認值是1day
    • EXECUTION_COUNT:默認值是30,在evaluation period內,若是一個query的執行次數超過指定的數值,那麼捕獲該query。
    • TOTAL_COMPILE_CPU_TIME_MS:默認值是1000ms,在evaluation period內,若是一個query的編譯時間超過指定的時間,那麼捕獲該query。
    • TOTAL_EXECUTION_CPU_TIME_MS:默認值是100,在evaluation period內,若是一個query的執行時間超過指定的時間,那麼捕獲該query。

例如,使用默認值來啓用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捕獲的信息

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 界面化查詢

在啓用Query Store以後,刷新SSMS的Object Explorer面板,會發現,SSMS新增長了一個Query Store的目錄,這是SSMS爲了方便用戶查詢而內置的查詢界面:

以迴歸查詢(Regressed Queries)來舉例,Regressed Queries面板顯示的是查詢和相應的Plan,從Metric列表中選擇須要顯示的度量:

 

四,Query Store相關的視圖

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

 

參考文檔:

Monitoring performance by using the Query Store

Query Store Catalog Views (Transact-SQL)

相關文章
相關標籤/搜索