解决SQL查询性能问题

日期: 2011-11-27 作者:Don Jones翻译:曾少宁 来源:TechTarget中国

一旦您优化了数据库索引,配备了最好的硬件和最快的磁盘,您将遇到的瓶颈是SQL Server主机的最大性能。在一定程度上,您必须关注于应用程序的优化,而不是SQL Server本身。这就要求进行最复杂的查询分析,确定那些(由于编写不当而造成)性能不佳的数据库查询。   SQL Server具有一个非常优秀的工具SQL Profiler,它是专门用来捕捉追踪信息的。

我们可以认为它与网络数据包捕捉类似:捕捉发向SQL Server的实际原始查询,以及它们的执行时间信息。通过这些原始数据,您就能够确定一些次优查询,然后向应用程序开发人员提出改进建议。   实际的性能改进决定于应用程序本身的修改,所以对……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

一旦您优化了数据库索引,配备了最好的硬件和最快的磁盘,您将遇到的瓶颈是SQL Server主机的最大性能。在一定程度上,您必须关注于应用程序的优化,而不是SQL Server本身。这就要求进行最复杂的查询分析,确定那些(由于编写不当而造成)性能不佳的数据库查询。

  SQL Server具有一个非常优秀的工具SQL Profiler,它是专门用来捕捉追踪信息的。我们可以认为它与网络数据包捕捉类似:捕捉发向SQL Server的实际原始查询,以及它们的执行时间信息。通过这些原始数据,您就能够确定一些次优查询,然后向应用程序开发人员提出改进建议。

  实际的性能改进决定于应用程序本身的修改,所以对于无法修改源代码的预打包应用程序,这种方法通常是不可行的。相反,这种方法通常只适用于内部应用程序。通过这种方法,您与您的团队可以对代码进行修改,从而改进性能。

  打开SQL Profiler,您首先需要创建一个新的追踪。追踪的定义是由一系列希望捕捉的事件组成的。

  您通常希望捕捉远程过程调用(RPC)事件及Transact-SQL事件,因为这两种事件类型代表了向SQL Server提交或存储过程能够执行的两种查询方式。我通常在追踪中加入以下两种事件类型:

  RPC:Completed。这是在RPC上执行一个存储过程后产生的,包含诸如执行时间、CPU使用率和存储过程名称等参数信息。

  SP:StmtCompleted。这是在存储过程中一条语句执行完成时触发的,也包含如执行时间和CPU使用率等数据指标。

  SQL:BatchCompleted。在Transact-SQL批处理结束时出现;它提供了与上面所列的RPC和存储过程示例类似的数据。

  SQL:BatchStarting。在Transact-SQL批处理开始时出现,包括内部和外部存储过程。

  显示计划XML。查询计划的图形化执行效果——理解查询执行方式及确定性能问题的关键。

  一旦建立了追踪,它就开始捕捉数据。您肯定希望捕捉有代表性的数据,而通常这意味着需要在生产负载中执行这些追踪。一定不要捕捉您分析的主机上的文件或SQL Server表,否则分析本身会影响性能。

  您需要在SQL Profiler中指定您希望查看的数据字段;我通常采用下面这个清单:

  •   Duration
  •   ObjectName
  •   TextData
  •   CPU
  •   Reads
  •   Writes
  •   DatabaseName
  •   ApplicationName
  •   StartTime
  •   EndTime
  •   EventSequence

  通过这些字段,我能够很好地了解每一个查找的执行时间,而且我通常只浏览那些Duration字段值特别大的数据。您将希望关注那些执行时间较长的查询,以确定是否需要改进执行时间。执行时间是以毫秒为单位的(虽然它实际存储的是微秒),所以这些值看起来都很大。

  我还将检查CPU字段,因为一个查询虽然执行速度很快,但是可能会消耗很多的CPU时间。繁重的CPU查询通常会在服务器特别繁忙而无法给它们提供足够CPU容量时发生停顿;因此,需要重写这些查询,使它们减少CPU使用,从而提高性能。Profiler支持创建过滤器。我通常先创建一个过滤器,隐藏所有小于5,000毫秒的查询,这样我就能够关注那些执行时间较长的查询。

  总而言之,可以检查的项目有很多,但是这些问题的大多数解决方法都是由应用程序开发人员实现的:

  •   在存储过程之外执行的临时SQL查询。存储过程几乎总是具有较优的性能,因为SQL Server能够缓存它们的执行计划;如果可能,临时查询应该转换为存储过程。

  执行计划中的执行时间较长和CPU使用繁重的查询。表扫描操作表示缺少有效的索引,通过增加索引而消除表扫描操作,会立刻对性能带来下面影响。

  包含大量联合的查询。联合耗费时间,而大量联合可能大大减慢执行速度。我一般最多采用7个联合;如果超过7个,那么一定要截短。

  执行速度总是很慢的查询。重写这个查询可能会提高性能。有时候执行较慢的查询很可能是受到外部因素的影响,如锁或资源争夺。

  查询性能优化并非什么科学研究,实际上它属于应用程序开发人员的职责。数据库人员的目标是确定执行速度较慢或者占用CPU严重的查询,收集证据,然后与开发人员一起确定解决问题的方法。

  其他确定不良查询的好工具

  虽然SQL Profiler是很好的工具,但是它实际上并不能直接帮您找到速度较慢的查询;您需要自己检查数据Profiler捕捉的数据,然后确定哪些查询是“慢的”。如果查询故障修复成为您的日常工作,那么您可能希望寻求其他专门执行查询优化的工具。

  这些工具是由第三方软件供应商编写的,可以专门用来捕捉与Profiler相同的数据(其中一些实际上接受Profiler捕捉文件作为输入),然后为您确定那些性能不佳的查询。在许多时候,这些工具能够确定为什么某个查询的性能不佳,甚至会给出一些提高性能的修改建议。

  这个领域的供应商包括SQL Sentry、Red Gate、Idera、Quest Software、DBSophic等。那么能够与SQL Profiler交互的工具,或者完全替代它的工具,都具有自动执行查询分析和规范建议的功能。如果是刚开始与供应商进行售前沟通,那么您一定要问清楚,在分析生产服务器时,这个产品会对性能造成什么样的影响(如果有)。有一些供应商会采用一些方法减小或消除对生产环境的影响,而这些方法总是很不错的。

作者

Don Jones
Don Jones

投稿作者

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐