如何找出你性能最差的SQL Server查询
我经常会被反复问到这样的问题:”我有一个性能很差的SQL Server。我如何找出最差性能的查询?“。因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导。
问SQL Server!
SQL Server的一个优点是它本身能回答几乎所有你的问题,因为SQL Server在各个DMV和DMF里存储了很多故障排除信息。另一方面这也是个缺点,因为你必须知道各个DMV/DMF,还有如何把它们解释和关联在一起。
至于你的最差性能SQL Server查询的一个最重要的DMV是sys.dm_exec_query_stats。对于每个缓存的执行计划,SQL Server存储了这个执行计划在运行时的详细信息。另外SQL Server告诉你这个查询消耗的CPU时间和I/O读取。当我对性能很差的SQL Server进行故障排除时,这是我经常使用的基本DMV之一。
让我们进入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个最差性能的查询:
-- Worst performing CPU bound queries
SELECT TOP 5
st.text,
qp.query_plan,
qs.*
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY total_worker_time DESC
GO
你可以看到这里我使用了简单的ORDER BY total_worker_time DESC来返回CPU密集的查询。另外也通过调用sys.dm_exec_sql_text和sys.dm_exec_query_plan DMF来抓取SQL语句和执行计划本身。下列代码显示如何依据I/O消耗来找出你性能最差的查询。
-- Worst performing I/O bound queries
SELECT TOP 5
st.text,
qp.query_plan,
qs.*
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY total_logical_reads DESC
GO
当在你面前有SQL语句和执行计划时,你可以进一步分析查询找出是什么引起高CPU或I/O消耗。
小结
SQL Server是个惊艳的产品:它可以立即给你问题的很好答案。你只要知道在哪里找你的答案。至于性能很差的查询,你总应该通过分析DMV sys.dm_exec_query_stats开始,在这里SQL Server保存里你执行计划运行时统计信息。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/04/20/how-to-find-your-worst-performing-sql-server-queries/
如何找出你性能最差的SQL Server查询的更多相关文章
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
- sql server 查询性能最差的sql语句
SELECT TOP 10 TEXT AS 'SQL Statement' ,last_execution_time AS 'Last Execution Time' ,(total_logical_ ...
- SQL Server查询性能
sql server常用语句总结 http://ace105.blog.51cto.com/639741/792519 SQL Server 性能调优(一)--从等待状态判断系统资源瓶颈 ...
- Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor
原文:Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor 一.工具概要 数据库应用系统性能低下,需要对其进行优化 ...
- 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率
原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...
- [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...
- SQL Server 查询性能优化 相关文章
来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...
- 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能
首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...
- SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用
近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回 ...
随机推荐
- ubuntu下安装oracle
本来打算在 redhat 下面安装了,但是没有 redhat 的盘了,就装了个 ubuntu 桌面版,结果安装起来十分费劲,主要是之前没安装过,对 oracle 的架构和配置也不太懂. 下面记录我安装 ...
- 滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面
SwipeBackLayout是一个很好的类库,它可以让Android实现类似iOS系统的右滑返回效果,但是很多用户在使用官方提供的Demo会发现,可能出现黑屏或者返回只是看到桌面背景而没有看到上一个 ...
- Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...
- ELK——Logstash 2.2 mutate 插件【翻译+实践】
官网地址 本文内容 语法 测试数据 可选配置项 mutate 插件可以在字段上执行变换,包括重命名.删除.替换和修改.这个插件相当常用. 比如: 你已经根据 Grok 表达式将 Tomcat 日志的内 ...
- web跨域解决方案
阅读目录 什么是跨域 常用的几种跨域处理方法: 跨域的原理解析及实现方法 总结 摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自己搞懂这方面的知识 ...
- 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?
一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...
- EF中一对多的关系中,用单字段保存ID拼接字符串
model.SubjectTerms = model.SelectedSubjectTerm.Trim(',').Split(',').ToList().Select(x => new Subj ...
- <[你在荒废时间的时候别人都在拼命!]>
如果我在这里退缩了,那么再也不可能前进 当人有了目标的时候,就会有拼命努力的动力. 当一个人真的掌握了一些东西的时候,才会觉得踏实,这就是所谓的内涵. 人生其实就是这样一步步走过去的.付出总有回报,回 ...
- tooltip提示插件
tooltip提示信息插件 原理:定位元素在页面中的位置即坐标信息,将显示节点元素插入到body中绝对应为到相应位置,显示内容从指定元素的属性(dataMess)中获取或者通过设置获取. 使用方法: ...
- Linux实现ftp账号同时访问两个目录方法
在做项目时,客户需要FTP同时访问两个目录,要清楚,在建FTP时,都是一个用户对应一个目录,当FTP用户登录后,就只访问当前目录,如果需要访问到其他目录,得另想办法.刚开始以为使用链接可以实现这个功能 ...