如何找出你性能最差的SQL Server查询

发表于:2015-11-10 10:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Woodytu    来源:51Testing软件测试网采编

  我经常会被反复问到这样的问题:”我有一个性能很差的SQLServer。我如何找出最差性能的查询?“。因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导。
  问SQLServer!
  SQLServer的一个优点是它本身能回答几乎所有你的问题,因为SQLServer在各个DMV和DMF里存储了很多故障排除信息。另一方面这也是个缺点,因为你必须知道各个DMV/DMF,还有如何把它们解释和关联在一起。
  至于你的最差性能SQLServer查询的一个最重要的DMV是sys.dm_exec_query_stats。对于每个缓存的执行计划,SQLServer存储了这个执行计划在运行时的详细信息。另外SQLServer告诉你这个查询消耗的CPU时间和I/O读取。当我对性能很差的SQLServer进行故障排除时,这是我经常使用的基本DMV之一。
  让我们进入sys.dm_exec_query_stats!
  当你对sys.dm_exec_query_stats进行一个简单的SELECT查询,你会得到有很多不同列的一个非常广泛的记录集——有大量的不同数字。 
  我们来仔细看下它们。对于每个缓存的执行计划,SQLServer给你下列度量的信息:
  WorkerTime(columns…_工作者时间)
  PhysicalReads(columns…_物理读)
  LogicalWrites(columns…_逻辑写)
  LogicalReads(columns…_逻辑读)
  SQLCLRTime(columns…_公共语言运行时间)
  ElapsedTime(columns…_运行时间)
  RowCount(columns…_行数)
  对于每个度量,你得到4个集合信息的不同列:
  总值(Totalvalue)
  上个值(Lastvalue)
  最小值(Minvalue)
  最大值(Maxvalue)
  手上有了这些信息找出你性能最差的查询是什么。但首先你要知道什么是你的性能瓶颈——CPU还是I/O限制?如果你的性能瓶颈是CPU限制,你可以用下列查询问SQLServer根据CPU消耗列出前5个最差性能的查询:
  --WorstperformingCPUboundqueries
  SELECTTOP5
  st.text,
  qp.query_plan,
  qs.*
  FROMsys.dm_exec_query_statsqs
  CROSSAPPLYsys.dm_exec_sql_text(qs.plan_handle)st
  CROSSAPPLYsys.dm_exec_query_plan(qs.plan_handle)qp
  ORDERBYtotal_worker_timeDESC
  GO
  你可以看到这里我使用了简单的ORDERBYtotal_worker_timeDESC来返回CPU密集的查询。另外也通过调用sys.dm_exec_sql_text和sys.dm_exec_query_planDMF来抓取SQL语句和执行计划本身。下列代码显示如何依据I/O消耗来找出你性能最差的查询。
  --WorstperformingI/Oboundqueries
  SELECTTOP5
  st.text,
  qp.query_plan,
  qs.*
  FROMsys.dm_exec_query_statsqs
  CROSSAPPLYsys.dm_exec_sql_text(qs.plan_handle)st
  CROSSAPPLYsys.dm_exec_query_plan(qs.plan_handle)qp
  ORDERBYtotal_logical_readsDESC
  GO
  当在你面前有SQL语句和执行计划时,你可以进一步分析查询找出是什么引起高CPU或I/O消耗。
  小结
  SQLServer是个惊艳的产品:它可以立即给你问题的很好答案。你只要知道在哪里找你的答案。至于性能很差的查询,你总应该通过分析DMVsys.dm_exec_query_stats开始,在这里SQLServer保存里你执行计划运行时统计信息。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号