各位新朋友~记得先点蓝字关注我哦~
小编在sql server的运维过程中,经常会被客户反复问到这样的问题:”我的SQL Server 数据库很糟糕,运行sql 语句很慢,是语句本身导致的吗?那我如何找出最差性能的查询?“。
因此在今天的公众号文章里小编会给大家一些让你很容易找到问题答案的方法。
01
问SQL Server本身!
哈哈哈,你会不会以为小编在向你开玩笑?不不不
SQL Server的一个优点是它本身能回答几乎所有你的问题,因为SQL Server在各个DMV和DMF里存储了很多故障排除信息。另一方面这也是个缺点,因为你必须知道各个DMV/DMF的作用和含义,还有如何把它们解释和关联在一起。
DMV和DMF是什么?一定会有人问小编这个问题吧?
DMV/DMF全称 Dynamic management view/function,简而言之就是系统动态管理视图和函数。
那他们的作用是什么呢?
官方文档给出了解答:动态管理视图和函数返回可用于监视服务器实例的运行状况、诊断故障以及优化性能的服务器状态信息。
至于我们最初的问题,我的最差性能SQL Server查询的一个最重要的DMV是sys.dm_exec_query_stats视图。对于每个缓存的执行计划,SQL Server存储了这个执行计划在运行时的详细信息。另外SQL Server告诉你这个查询消耗的CPU时间和I/O读取。当小编我对性能很差的SQL Server进行故障排除时,这是我经常使用的基本DMV之一。
02
让我们进入sys.dm_exec_query_stats
当你对sys.dm_exec_query_stats进行一个简单的SELECT查询,你会得到有很多不同列的一个非常广泛的记录集——有大量的不同数字。

我们来仔细看下它们。对于每个缓存的执行计划,SQL Server给你下列度量的信息:
· Worker Time (columns …_工作者时间)
· Physical Reads (columns …_物理读)
· Logical Writes (columns …_逻辑写)
· Logical Reads (columns …_逻辑读)
· SQLCLR Time (columns …_公共语言运行时间)
· Elapsed Time (columns …_运行时间)
· Row Count (columns …_行数)
对于每个度量,你得到4个集合信息的不同列:
· 总值(Total value)
· 上个值(Last value)
· 最小值(Min value)
· 最大值(Max value)
手上有了这些信息找出你性能最差的查询是什么。但首先你要知道什么是你的性能瓶颈——CPU还是I/O限制?如果你的性能瓶颈是CPU限制,你可以用下列查询问SQL Server根据CPU消耗列出前5个最差性能的查询:

大家可以看到这里我使用了简单的ORDER BY total_worker_time DESC来返回CPU密集的查询。另外也通过调用sys.dm_exec_sql_text和sys.dm_exec_query_plan DMF来抓取SQL语句和执行计划本身。下列代码显示如何依据I/O消耗来找出你性能最差的查询。

当在大家面前有SQL语句和执行计划时,你可以进一步分析查询找出是什么引起高CPU或I/O消耗。
03
小结
SQL Server是个很棒的数据库产品:它可以立即给你问题的很好答案。你只要知道在哪里找你的答案,怎么使用这款产品。至于性能很差的查询,你总应该通过分析DMV sys.dm_exec_query_stats开始,在这里SQL Server保存里你执行计划运行时统计信息。

美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。







