首页  ·  知识 ·  数据库
解决SQL查询性能问题
网友  IT新闻网  MS-SQL  编辑:dezai   图片来源:网络
一旦您优化了数据库索引,配备了最好的硬件和最快的磁盘,您将遇到的瓶颈是SQLServer主机的最大性能。在一定程度上,您必须关注于应用程序的优化,而不是SQLServer本身。这就要求进行最复杂的查
 一旦您优化了数据库索引,配备了最好的硬件和最快的磁盘,您将遇到的瓶颈是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交互的工具,或者完全替代它的工具,都具有自动执行查询分析和规范建议的功能。如果是刚开始与供应商进行售前沟通,那么您一定要问清楚,在分析生产服务器时,这个产品会对性能造成什么样的影响(如果有)。有一些供应商会采用一些方法减小或消除对生产环境的影响,而这些方法总是很不错的。

本文作者:网友 来源:IT新闻网
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读