SQL Server ->> SQL Server 2016新特性之 --- Query Store

前言

SQL Server 2016引入新的查询语句性能监控、调试和优化工具/功能 -- Query Store。以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV(比如sys.dm_exec_query_stats, sys.dm_exec_sql_text和sys.dm_exec_query_plan)来获取查询计划的一些信息,比如XML格式的执行计划,查询语句的代码,执行了多少次以及一些资源和时间的的使用消耗情况。然后根据这些信息来判断这条语句是否存在性能问题。问题在于但一条语句出现了性能下降,我们可能需要和过去的信息进行一个比较,才能知道性能是否下降了。比如一条语句如果过去花了1秒,现在3-5秒,我们可能第一眼会认定它是没有问题的,但是其实它性能是下降了的。所以我还需要一个任务去定时收集这些资料。比如下面这条语句就是用来收集这些信息的。

SELECT s2.dbid,
    (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,
      ( (CASE WHEN statement_end_offset = -1
         THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)
         ELSE statement_end_offset END)  - statement_start_offset) / 2+1))  AS sql_statement,
    s3.query_plan,
    execution_count,     plan_generation_num,     last_execution_time,       total_worker_time,     last_worker_time,     min_worker_time,
    max_worker_time,    total_physical_reads,     last_physical_reads,
    min_physical_reads,      max_physical_reads,      total_logical_writes,     last_logical_writes,     min_logical_writes,     max_logical_writes
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS s3

SQL Server 2016引入了Query Store来自动收集数据库的查询计划和相关的一些性能信息,还提供了4种不同类型的报表可以来查看收集的数据。不通过报表,我们也可以通过一些新增的DMV来查询收集好的数据。

那么究竟Query Store可以在哪些方面帮到我们?

1)快速定位查询语句的查询计划性能回退,找出哪些查询语句最近因为查询计划的改变出现性能回退?这当中可能是因为删除了某条索引、过去某个时间点有大量的数据涌入数据表中而统计数据没有及时得以更新、或者最近代码发现了改变等原因。

2)获知查询在某段时间内的资源使用/占用情况以及执行次数。有时语句本身可能执行计划没有回退的情况出现,但是由于语句本身写法问题或者缺乏合理的索引,导致语句的执行非常消耗资源,对于SQL Server整体的性能或者服务器的性能造成很大的印象。作为DBA本身也需要及时去定位这些类型的语句,最后得出一些解决办法。

3)获知数据库过去某段时间内的整体查询工作负荷,包括承受的并发查询压力(量级),资源消耗情况。

架构

Query Store存储分两部分,一部分是用于存储编译好的执行计划的Plan Store,另一部分用于存储语句执行执行过程中的一些统计数据。这些数据先是驻留在内存,随后会根据你设定好的时间间隔写入到数据库的主文件组中。

因为Query Store也需要背面的线程来定时写入数据,所以启用Query Store大概会付出3-5%的性能代价。间隔越短,性能的代价越大。间隔大了,由于SQL Server重启导致丢失收集好在内存中但是还没有写入磁盘的那些数据的损失就越大。

Query Store在访问收集好的数据时是会先查看数据是否是否已经在内存中,这样就必须去磁盘找了。只有不在内存中才去磁盘找。它会先调用一个叫QUERY_STORE_RUNTIME_STATS_IN_MEM的表函数去访问内存中的数据,同时访问plan_persist_runtime_stats这张表去访问磁盘的数据。

启用Query Store功能

通过代码启用Query Store

ALTER DATABASE XXXXX SET  QUERY_STORE = ON;

ALTER DATABASE XXXXX
SET QUERY_STORE
  (
  MAX_STORAGE_SIZE_MB = 250,
  SIZE_BASED_CLEANUP_MODE = AUTO,
  CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30)
  );

上面括号中的选项对应的GUI上选项列表

内置Query Store报表

这大概是Query Store最有用的功能。通过报表的形式和已经定制好的性能调优类型的报表来让用户知道过去一段时间内的数据情况。

目前一共提供了4种类型的报表,分别的:回归的查询,总体资源的使用,前几个资源使用的查询,跟踪的查询。

Query Store相关的DMV

他们的关系

select *
from sys.query_store_query qsq join
        sys.query_context_settings qcs on qsq.context_settings_id = qcs.context_settings_id join
        sys.query_store_query_text qst on qst.query_text_id = qsq.query_text_id join
        sys.query_store_plan qsp on qsp.query_id = qsq.query_id join
        sys.query_store_runtime_stats qsrs on qsrs.plan_id = qsp.plan_id join
        sys.query_store_runtime_stats_interval qsrsi on qsrsi.runtime_stats_interval_id = qsrs.runtime_stats_interval_id

参考:

SQL Server 2016:通过Query Store定位回归缺陷

The SQL Server 2016 Query Store: Overview and Architecture

时间: 2024-08-05 05:19:58

SQL Server ->> SQL Server 2016新特性之 --- Query Store的相关文章

SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

SQL Server 2016新特性:DROP IF EXISTS

原文:SQL Server 2016新特性:DROP IF EXISTS ?? 在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧版本: IF OBJECT_ID('dbo.PERSON','U') IS NOT NULL DROP TABLE PERSON IF EXISTS (SELECT * FROM sys.objects where name = 'PERSON') DROP TABLE PERSON SQL Ser

AlwaysOn 2016新特性和提升

AlwaysOn 2016新特性和提升 AlwaysOn可用性组作为SQL Server 2012的新特性被引入,它增强了数据库镜像和故障转移集群技术,提供了高可用和灾难恢复. 在SQL Server 2016中AlwaysOn有些特性的增强要求运行在Windows Server 2016上.然而,如果你仍然运行在Windows Server 2012 R2上,仍然有很多提升是可用的. AlwaysOn 2016一些新特性和增强: l 支持更多故障转移目标 l 更好的日志传输性能 l 可读副本的

SQL Server 2016新特性:Live Query Statistics

SSMS可以提供可以查看正在执行的计划.live query plan可以查看一个查询的执行过程,从一个查询计划操作到另外一个查询计划操作.live query plan提供了整体的查询运行进度和操作级别的执行统计信息,比如产生的行数,执行的时间,操作进度等等.因为这些数据是实时的,不需要等待查询完成,这些统计信息对调试查询性能问题很有用.这个特性从SQL Server 2016开始,但是在2014上也可以运行了. Remark 到SQL Server 2016,有2个方法开启Statistic

SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一些像邮件或者工资这样敏感的数据,涉及PII的,我们可以运用这个功能.运用这个功能的步骤,首先先定义一组人(database role)可以拥有看数据的权限,然后GRANT UNMASK权限给这个角色组.微软提供了4种类型的masking给我们选择:default,email,random和custo

SQL Server 2016新特性:In-Memory OLTP

存储格式修改 在2014,2016中修改了内存优化表的存储格式,新的格式是序列的并且the database is restarted once during database recovery. ALTER TABLE日志优化,并且可以并发运行 当你在内存优化表执行ALTER TABLE,只有元数据的修改会被写入日志.这样减少了大量的日志.并且很多ALTER TABLE是并行的,这样可以减少语句运行的时间 但是如果包含LOB,就不能并行运行 统计信息 优化表的统计信息可以自动更新.另外可以通过

SQL Server 2016新特性:列存储索引新特性

行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可以在创建表的时候创建,也可以在之后的alter table语句上创建.之前内存优化表不支持列存储索引. 聚集的列存储索引可以有多个非聚集行存储索引,之前列存储索引不支持非聚集索引. 支持在聚集列存储索引上加入主键和外键约束,约束使用btree索引. 列聚集索引有一个压缩延迟选项,让事务复合收到的影响最小. 兼容级别为120,130的数据库性能: 列存储索

SQL Server 2016新特性:数据库级别配置

新的  ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) 用来配置数据库级别配置. 这个语句可以配置每个数据库的配置: 清理过程cache 设置MAXDOP参数,可以配置primary和secondary 设置查询优化器的评估模式 启动和关闭数据库级别的参数嗅探 启动和关闭数据库级别的查询优化补丁 启动和关闭数据库级别的identity cache 语法: ALTER DATABASE SCOPED CONFIGURATION { {  [ F

SQL Server 2016新特性:Temporal Table

什么是系统版本的Temporal Table 系统版本的Temporal Table是可以保存历史修改数据并且可以简单的指定时间分析的用户表. 这个Temporal Table就是系统版本的Temporal Table因为每行的有效期由系统托管的. 每个Temporal Table有2个显示定义的列,类型是datetime2.这些用来表示有效期.这个列用来标记这个行是不是在期间内可用. 除了上面的period列,l临时表也包含了引用到其他表,系统使用这个表来保存行修改删除前的行版本.这个附加表可