SQL Server 2016 查询存储(Query Store)查询语句

SQL Server 2016 查询存储(Query Store)查询语句

 

问题

SQL Server 2016的新特性之一是查询存储。在之前的查询存储相关文章中我们回顾了如何使用SQL Server Management Studio配置和访问查询存储。我们也提供了查询存储使用的示例。使用查询存储的一些实际应用程序是什么?什么查询可以针对查询存储运行?我可以回答哪些问题?

 

解决方案

对一下查询语句,我们将使用查询存储目录视图和存储过程。我们将在微软MSDN网站提供其他可用查询的参考。

 

有用的SQL Server 2016查询存储查询语句

 

找出查询存储的大小

 

使用这个查询你可以找出查询存储使用的大小和最大值:

SELECT current_storage_size_mb, max_storage_size_mb FROM sys.database_query_store_options

 

在查询存储中找出一个查询的ID

 

基于部分查询的文本或者部分对象(视图、存储过程等)名称找到一个查询的ID:

SELECT q.query_id, t.query_sql_text, object_name(q.object_id) AS parent_object
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
WHERE t.query_sql_text LIKE N'%insert %db_store%'
OR object_name(q.object_id) = 'proc_1'

 

找到一个查询相关的执行计划

 

基于查询的ID(如果知道),找到执行计划的ID,部分查询文本或父对象(视图、存储过程等)名称:

SELECT t.query_sql_text, q.query_id, p.plan_id, object_name(q.object_id) AS parent_object
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
WHERE q.query_id = 1
-- OR t.query_sql_text LIKE N'%SELECT c1, c2 FROM dbo.db_store%'
-- OR object_name(q.object_id) = 'proc_1'

 

在SQL Server查询存储中找到带有多个执行计划的排名前十查询

 

SELECT TOP 10 t.query_sql_text, q.query_id,
object_name(q.object_id) AS parent_object,
COUNT(DISTINCT p.plan_id) AS num_of_plans
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
GROUP BY t.query_sql_text, q.query_id, object_name(q.object_id)
HAVING COUNT(DISTINCT p.plan_id) > 1
ORDER BY COUNT(DISTINCT p.plan_id) DESC

 

在查询存储中找出最常执行的SQL Server查询语句排名前十名

 

SELECT TOP 10 t.query_sql_text, q.query_id,
object_name(q.object_id) AS parent_object,
SUM(s.count_executions) total_executions
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats s ON p.plan_id = s.plan_id
WHERE s.count_executions > 1 -- used to make the query faster
GROUP BY t.query_sql_text, q.query_id, object_name(q.object_id)
ORDER BY SUM(s.count_executions) DESC

 

在查询存储中找出影响最大数量行数的SQL Server查询排名前十名

 

这可能对检查是否有返回大量行的查询有用,并且后面可能要研究是否过滤条件可以被添加到查询。

 

我们有一个旧的应用程序初始化使用了一个小表。开发使用一个查询从该表返回所有的记录。当数据库和表增长数年后,这的确影响了应用的性能。

SELECT top 10 t.query_sql_text, q.query_id,
object_name(q.object_id) AS parent_object,
s.plan_id, s.avg_rowcount
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats s ON p.plan_id = s.plan_id
WHERE s.avg_rowcount > 100
ORDER BY s.avg_rowcount DESC

 

我们需要过滤查询排除对大表的索引操作。

 

在查询存储中找出每次执行的编译的最大百分比的排名前十名SQL Server查询

 

有时查询性能可能会被过度的重编译锁影响。使用它找出大量编译的前十名查询:

WITH Query_Stats
AS
(
SELECT plan_id,
SUM(count_executions) AS total_executions
FROM sys.query_store_runtime_stats
GROUP BY plan_id
)
SELECT TOP 10 t.query_sql_text, q.query_id, p.plan_id,
s.total_executions/p.count_compiles avg_compiles_per_plan
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN Query_Stats s ON p.plan_id = s.plan_id
ORDER BY s.total_executions/p.count_compiles DESC

 

在这里阅读更多关于重编译执行计划。

 

清理SQL Server查询存储数据

 

你可以使用sp_query_store_remove_plan存储过程从查询存储移除一个特定执行计划(对于执行计划的运行时统计也将会被清空):

EXEC sp_query_store_remove_plan @plan_id = 1
GO

 

使用sp_query_store_reset_exec_stats存储过程,你可以对特定的执行计划删除运行时统计,但是保持执行计划在查询存储中:

EXEC sp_query_store_reset_exec_stats @plan_id = 1
GO

 

你也可以从查询存储使用sp_query_store_query存储过程移除整个查询。这也将会从查询存储移除相关的执行计划和统计信息:

EXEC sp_query_store_remove_query @query_id = 1

 

其他有用查询

 

一些其他有用查询可以在微软MSDN网站这里找到:

l 数据库上最近执行的n条查询

l 每个查询的执行次数

l 最近1小时最长平均执行时间的查询的数量

l 最近24小时最大平均物理IO读的查询的数量,以及平均行数和执行数量

l 当前查询性能回归的查询(比较不同的时间点)

l 当前查询性能回归的查询(比较当前和历史执行)

l 删除即席查询

 

对于你的查询的其他列

 

对于你的查询,你可以找到以下有用列:

l is_parallel_plan列在sys.query_store_plan目录视图

l avg_dop列在sys.query_store_runtime_stats目录视图

l query_parameterization_type列在sys.query_store_query目录视图

l is_internal_query列在sys.query_store_query目录视图

 

接下来

 

l 使用查询存储目录视图写你自己的查询。

l 下载最新的SQL Server 2016评估版本。

l 阅读SQL Server 2016联机帮助文档。

l 阅读如何使用查询存储监控性能。

l 阅读其他SQL Server 2016的文章。

你可能感兴趣的:(sql,server,query,performance,tuning,store,2016)