Azure SQL DB/DW 系列(10)——重新認識Query Store(3)——配置查詢存儲

本文屬於Azure SQL DB/DW系列
上一文:Azure SQL DB/DW 系列(9)——重新認識Query Store(2)——工作原理
本文介紹Query Store的配置,包括PaaS平臺和非雲版本

默認設置

  和其他功能一樣,要最大化它的潛在用處,需要按需配置。Query Store在非雲版本中(託管實例除外,因爲託管實例非常接近非雲版本)默認是不開啓的,如果你需要使用,當然要開啓它,直接開啓可以使用下面命令即可。

ALTER DATABASE [數據庫名] SET QUERY_STORE = ON;

  如果你有足夠的權限,又希望全部用戶庫都打開,那麼可以使用下面命令打開除了master和Tempdb之外的庫:

DECLARE @SQL NVARCHAR(MAX) = N'';
SELECT @SQL += REPLACE(N'ALTER DATABASE [{{DBNAME}}] SET QUERY_STORE=ON ',
      '{{DBName}}', [name])
FROM sys.databases
WHERE state_desc = 'ONLINE'
      AND [name] NOT IN ('master', 'tempdb')
ORDER BY [name];
EXEC (@SQL);

  前面已經提到,不能對master和TempDB啓用,但是可以對Model啓用,它並不是真的會收集Model庫的運行信息,而是跟其他配置一樣,把這個配置封裝進去,以便新建的數據庫自動帶有這個屬性。對於msdb,跟用戶庫的運行模式一樣。
  下面是配置項的清單,包含了Azure SQL DB和非雲版本:
在這裏插入圖片描述
  下面針對上表列出的內容說明一下。

OPERATION_MODE

  Query Store可以運行在read-only或者read和write模式下,在只讀模式下,數據依舊會在Query Store,但是新查詢從配置這個選項起不再被收集。這個選項常用於Query Store空間已滿的情況,但是你又需要先分析已經存儲的數據時。通常來說建議使用READ_WRITE:

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( OPERATION_MODE = READ_WRITE );

  查詢存儲具有實際狀態和所需狀態的概念。如果所需狀態爲READ_WRITE,但實際狀態爲READ_ONLY,可以在目錄視圖sys.database_query_store_options 在列readonly_reason下顯示原因默認設置爲READ_WRITE。

CLEANUP_POLICY (STALE_QUERY_THRESHOLD_DAYS)

  Query Store是需要存儲數據的,而數據的保留時間和SIZE_BASED_CLEAN_UP和QUERY_STORE_CAPTURE_MODE都可能影響最終的數據存儲。默認值爲30天。

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = <Value> ) );

DATA_FLUSH_INTERVAL_SECONDS

  由於性能原因,Query Store收集的數據會根據配置的值先存儲到內存然後異步寫入磁盤。這個時間就是data flush interval,這個值是以秒爲單位。
  這個值在配置時需要小心,過快會對I/O進行壓力,過慢又容易在出現問題時丟失大量數據或者數據更新不及時。一般來說不需要變更,特別是變短。
  默認值爲900秒也就是15分鐘,修改命令爲:

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( DATA_FLUSH_INTERVAL_SECONDS = <Value> );

MAX_STORAGE_SIZE_MB

  就是Query Store的可用空間,如果空間快不夠了,那麼Query Store的狀態就會自動從READ_WRITE變成READ_ONLY,這個跟數據庫的LDF文件滿了之後數據庫變成只讀的現象是一樣的。
  即使SIZE_BASED_CLEARUP_MODE設爲AUTO,在非常高負載的環境下,還是有可能迅速達到空間上限。
  如果你的空間很多,當然設置大一點還是有好處的,不過要考慮STALE_QUERY_THRESHOLD_DAYS的值,保留時間也是影響因素。

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( MAX_STORAGE_SIZE_MB = <Value> );

QUERY_STORE_CAPTURE_MODE

  默認爲ALL,另外一個爲NONE,設置NONE會讓Query Store停止收集新的查詢,但是不會停止收集已經在Query Store中的查詢的運行時統計信息。第三個選項是AUTO,告訴 SQL Server 不要捕獲佔用大量資源或不經常執行的查詢。

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( QUERY_STORE_CAPTURE_MODE = [<Value>] );

  對於CUSTOM,有三個值去控制Query Store的收集行爲。這裏先不擴展介紹。例子如下:

ALTER DATABASE [<Database Name>]
SET QUERY_STORE = 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
      )
    );

MAX_PLANS_PER_QUERY

  默認爲200個執行計劃,但是2016不支持。數值越大,空間佔得越大,但是200個執行計劃對於分析一個查詢的性能問題而言,可以說剛剛好。如果你發現不夠,可以用下面命令檢查並擴展:

SELECT query_hash,
COUNT (DISTINCT query_plan_hash) distinct_plans
FROM sys.dm_exec_query_stats
GROUP BY query_hash
ORDER BY distinct_plans DESC;
ALTER DATABASE [<Database Name>] SET QUERY_STORE ( MAX_PLANS_PER_QUERY = <Value> );

WAIT_STATISTICS_CAPTURE_MODE

  默認爲ON,同樣不適合2016,另外一個值爲OFF,這部分比較重要,這裏暫時不展開,後面會專門介紹:

ALTER DATABASE [<Database Name>] SET QUERY_STORE ( WAIT_STATISTICS_CAPTURE_MODE = <Value> );

  由於GUI比較易用,只要瞭解配置即可,這裏就不演示了。但是GUI不能修改某些值,所以還是建議用命令來配置。
  sys.database_query_store_options裏面存儲了配置值,可以用於檢查。

最佳實踐

  首先配置MAX_STORAGE_SIZE_MB,確保不會太少,同時注意30天的保留時間是否足夠。通常建議2048MB爲起點。另外注意這些數據存儲在PRIMARY 文件組,確保空間足夠。
  其次就是QUERY_STORE_CAPTURE_MODE建議改爲AUTO,除非你有其他原因。
   SIZE_BASED_CLEANUP_MODE也應該設爲AUTO
  接下來是INTERVAL_LENGTH_MINUTES默認是60,如果不怎麼繁忙的系統,可以只改成15秒,如果非常繁忙的系統,可以改成60以上,但是不建議太多。
   WAIT_STATISTICS_CAPTURE_MODE設置爲ON,後面會介紹。

  下一文:Azure SQL DB/DW 系列(11)——重新認識Query Store(4)——深入配置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章