设为首页 收藏本站
查看: 691|回复: 0

[经验分享] SQL Server 2016 查询存储(Query Store)查询语句

[复制链接]

尚未签到

发表于 2018-6-25 07:11:24 | 显示全部楼层 |阅读模式
  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的文章。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-530285-1-1.html 上篇帖子: Powershell Scripting Game - March 2016 下篇帖子: SQL Server 2016 查询存储(Query Store)介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表