前言sql
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重启致使丢失收集好在内存中可是尚未写入磁盘的那些数据的损失就越大。 spa
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
参考: