热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQLServerProfiler--性能调校

SQLServerProfiler--性能调校性能有足够的理由成为一个热点话题。当今商业领域竞争激烈,如果用户认为某个应用程序速度太慢,就会立刻转向另一个供应商。为了满

SQLServerProfiler--性能调校性能有足够的理由成为一个热点话题。当今商业领域竞争激烈,如果用户认为某个应用程序速度太慢,就会立刻转向另一个供应商。为了满

SQL Server Profiler -- 性能调校

性能有足够的理由成为一个热点话题。当今商业领域竞争激烈,如果用户认为某个应用程序速度太慢,就会立刻转向另一个供应商。为了满足用户的要求,SQL跟踪加载了一些事件类,可以利用这些事件类来查找和调试性能瓶颈。

性能监视技术可以大致分为两个类别:在已知故障相关知识时使用的技术和用来查找故障所在(或者查找到底是否存在故障)的技术。如果查出这个故障的某些问题,就可以在这方面获取更多的信息。因此,从第2种帮助精确定位故障区域的技术开始,然后再讨论怎样进行更详细的分析。

当开始一个新的数据库性能调校工程时,首先要查明的就是哪个查询的效率最低。换言之,要确定最差性能的原因,这样可以找到最佳的调校效果。在这个阶段,不要跟踪太多的信息,通常只启动“Stored Procedures: RPC:Completed”和“TSQL: SQL:BatchCompleted”这两个事件。这些事件都在SQL Server性能分析器提供的TSQL_Duration模板中被选中。建议往这两个事件中添加默认模板中并没有选中的读、写和CPU列,以便获得更加完整的描述。也建议为“Stored Procedures: RPC:Completed”事件选择TextData列而不是(默认的)BinaryData列—这可以使后续处理数据的工作更简单。下图显示了一个完整的给定事件集合。

clip_image001

如果选择了事件,就要在生存期列上设置一个以毫秒计的短时过滤器。使用过的大部分活动OLTP系统都有极其大量的0毫秒查询,且在性能瓶颈方面,这些显然不是最好的。通常从设置为100毫秒的过滤器开始,然后从开始进行工作。方法是增加每次迭代上的信噪比,淘汰较小的查询,只保留有较高潜力进行性能调校的查询。根据应用程序和服务器荷载的不同,通常对每个迭代跟踪运行10~15分钟,然后查看结果并适度地增加这个数值直到在跟踪期间只得到几百个事件为止。这个10~15分钟的数字对于有些特别忙的应用程序来说太长了。

另一个选项是只运行初始跟踪,然后开始过滤结果。简单的方法就是使用SQL Server 2005的NTILE开窗函数,它将输入行分为数目相等的“桶”。如果只查看一个基于生存期的跟踪表里前10%的查询,可以使用如下查询:

SELECT * FROM ( SELECT *, NTILE(10) OVER(ORDER BY Duration) Bucket FROM TraceTable ) x WHERE Bucket = 10

注意:大量看上去很小的(甚至0毫秒的)查询组成的应用程序的执行也可能导致性能故障,但是这个问题一般需要通过移除无用的界面,系统有体系地解决,而不是通过Transact-SQL查询调校。如果不知道一个特定的应用程序的操作,那么通过性能分析查找这类问题也很困难,因此,这里不讨论这个问题。

如果发现很难将获得的返回事件数量限制在一个可控制级别(在忙碌的系统上这是很常见的问题),就不得不对结果做一些调整以使输出聚合得更好一些。从SQL跟踪获得的结果包含了每个查询的未加工文本数据,这些数据包括所有被实际用到的参数。为了进一步分析结果,这些数据应该被载入数据库中的一张表里,然后进行聚合,例如,得出逻辑读的平均生存期或数目。

问题在于如果成功地聚合SQL跟踪结果所返回的未加工文本数据。知道实际的参数有好处,对于重新产生性能问题很有用,但是在试图判断应当首先处理哪个查询前,最好先用查询“表单”聚合这些结果。例如,下列两个查询都是属于同一个表单,使用同样的表和列,只在WHERE子句使用的参数上有差别,但是由于它们的文本不同,因此要聚合它们是不可能的:

SELECT * FROM SomeTable WHERE SomeColumn = 1 --- SELECT * FROM SomeTable WHERE SomeColumn = 2

为了帮助解决这个问题,并将这些查询减少到可以聚合的一个常见表单,提供了一个CLR UDF,稍作修订的版本(也可以处理NULL)如下:

[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true)] Public static SqlString sqlsig(SqlString querystring) { Return (SqlString)Regex.Replace( Querystring.Value, @”([\s,(=<>!](?![^\]]+[\]](?:(?:(?:(?:(?# expression coming )(?:([N])?(‘)(?:[^’]’’)*(‘))(?# character )|(?:0x[\da-fA-F]*)(?# binary )|(?:[-+]?(?:(?:[\d]*\.[\d]*|[\d]+)(?# precise number )(?:[eE]?[\d]*)))(?# imprecise number )|(?:[~]?[-+]?(?:[\d]+))(?# interger )|(?:[nN][uU][lL][lL])(?# null ))(?:[\s]?[\+\-\*\/\%\&|\^][\s]?)?)+(?# operatoers )))#, @”$1$2$3#$4”); }

该UDF查找出大部分像参数的值,用“#”替代。用UDF处理完上面的两个查询后,输出应该一样:

SELET * FROM SomeTable WHERE SomeColumn = #

要用该UDF帮助处理一个跟踪表以找出前几位查询,可以从接下来的查询的某些行开始,该查询聚合了每一个常用的查询表单,并得到了生存期、读、写和CPU的平均值:

SELECT QueryForm, AVG(Duration), AVG(Reads), AVG(Writes), AVG(CPU) FROM ( SELECT Dbo.fn_sqlsig(TextData) AS QueryForm, l.* Duration AS Duration, l.* Reads AS Reads, l.* Writes AS Writes, l.* CPU AS CPU FROM TraceTable WHERE TextData IS NOT NULL ) x GROUP BY QueryForm

在这里,可以进一步用平均值进行过滤,以找出更多查询。

如果决定了对一个或多个查询进行调校,就可以用SQL跟踪来帮助做进一步的分析。例如,,假设已经将下列可以在AdventureWorks数据库中创建的存储过程作为故障原因隔离起来的显示:

CREATE PROCEDURE GetManagersAndEmployees @EmployeeID INT AS BEGIN SET NOCOUNT ON EXEC uspGetEmployeeManagers @EmployeeID EXEC uspGetManagerEmployees @EmployeeID END

要开始一个会话以分析该存储过程在做什么,首先要在SQL Server管理工作室中打开一个新的查询窗口,用@@SPID函数获取会话的spid。接下来,打开SQL Server性能分析器,连接到服务器上,并选择调校模板。

clip_image002

推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 多核处理器技术的显著进展可追溯至IBM于2001年推出的双核RISC处理器POWER4,标志着服务器处理器迈入多核时代。随后,HP和Sun等公司也纷纷加入这一行列,推动了多核处理器在不同领域的广泛应用。 ... [详细]
author-avatar
sdfa2255204
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有