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)——深入配置

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