当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 用sp_lock诊断SQL Sever的性能问题

MSSQL
SQL Server--全文本检索的应用(一)
SQL 2005的SSIS与Oracle的迁移性能
SQL优化实例:从运行30分钟到运行只要30秒
无法在SQL Server2005 Manger Studio 中录入中文的问题
SQL Artisan多表查询和统计
SQL Server数据库开发人员在应聘时经常被问到哪些问题
一个完整的SQL SERVER数据库全文索引的示例
SQL Server安全之加密术和SQL注入攻击
如何对SQL Server中的tempdb“减肥”
SQL Server 2005升级的十个步骤
如何在SQL Server开发中融入极限编程技术
SQL Server应用程序高级SQL注入(下)
SQL Server应用程序高级SQL注入(上)
SQL Server连接中的常见错误
IIS中SQL Server数据库的安全问题
SQL Server 2005区域配置和安全工具
保护 SQL Server 的十个步骤
如何利用SQL Server 2000的复制选项
SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
SQL SERVER 2005同步复制技术的应用

MSSQL 中的 用sp_lock诊断SQL Sever的性能问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 70 ::
收藏到网摘: n/a

在IT 专家中有一种普遍的误解,就是认为“锁定是不好的东西”,你必须尽一切可能保证数据库锁定不会使得进程无法正常运行。为了能够确保一个一致的数据库环境,在对资源进行修改时,数据库引擎必须利用一种机制来获得对资源的独占权。

SQL Server中也用锁定,它们是指为了达到这种一致性,数据库引擎用来保证每一次只有一个线程同时访问同一个资源的对象。如果不用锁定的话,各个进程同时进行数据修改就可能发生,这就会使数据库处于一种不一致的状态。这样看来,锁定就成了好东西;但是,你应该以特定的方式来计划你的应用程序,让涉及的锁定的数量降到最少。在这篇文章中,我将讨论一个让你能够分析数据库锁定问题的存储过程。

找出什么被锁定了

系统的反应迟缓意味着你应该做一些调查了。你的查找最好从测定系统发生锁定的数量和频率开始。如果你的系统环境处理事务性很高的话,这样各个应用程序争夺资源就会很常见,从而引起锁定。解决这些问题的关键就在于能够确定被锁定的资源和争夺资源的进程。

sp_lock

sp_lock这个系统存储过程与SQL Server 2000 打包在一起,它将使你对在你系统中发生的锁定有深入的了解。这个程序会从主数据库中的syslockinfo中返回与锁定相关的大量信息,而主数据库是一个包括了所有允许、转换和等待锁定请求信息的系统工作台。

让我们来看一下运行 sp_lock 程序之后,它会为我们提供什么信息:

EXECUTE sp_lock

在我的系统中,这是该存储过程返回的内容。sp_lock 返回的信息并不是一目了然的,要获得有用的数据,还需要做一些查找。但是,你也可以复制该存储过程的文本,然后创建一个新的,从而得到关于系统进程的更好的解释。(在这篇文章中,我们将集中讨论sp_lock返回的数据。)

从上面的结果我们可以看到spid、dbid、objid、indid、type、resource、mode和status字段。spid是进程标识号码,用于识别到SQL 服务器的连接。要发现哪些用户和该spid相连,你就要执行存储过程sp_who,并将spid作为一个参数传输给该程序。dbid是锁定发生的数据库,你可以在主数据库中的sysdatabases表格中找到它。字段objid用来显示在数据库中锁定发生所在的对象。要查看这个对象,你可以在主数据库中的sysobjects表格中查询指定的objid。

在以上的屏幕截图中产生的单一记录并不一定能显示正在你的工作环境中发生的真实情况。在运行这个程序时,你想要找到500到1000个甚至更多结果。每一次你执行sp_lock,都将有可能得到不同的结果,因为又发生了新的锁定,而部分旧的锁定已经被解除了。如果你发现sp_lock返回的结果中,大量的结果都有着相同的spid,很有可能该进程正在进行大型的处理,同时这些锁定可能开始阻止新事务的发生。

当你发现一个spid 获得了大量的数据库锁定时,这将有助于确定什么存储过程或语句正在运行。为了达到这个目的,运行以下 DBCC 命令:

DBCC INPUTBUFFER(spid)

这个DBCC命令将返回正在EventInfo字段中运行的语句的相关信息。

一个可靠的起点

系统运行缓慢可能说明你的表格上有大量的锁定。造成这些锁定的原因较多,如某个用户正在你的系统中运行一个相当长的查询,一个进程占用大量资源或者两个关键进程争夺同一资源,经常造成死锁。

一旦发现你认为正在减缓你系统速度的进程,应该怎么办?在大多数情况下,不能采取任何措施,只能监控系统。结束这个进程并不是明智之举,因为它包括了很多系统锁定,除非你完全肯定不会有其他的负面影响。不然的话,你就应该想办法自动分析锁定状况。还有一个解决办法就是想出一种方法,使得在一天的特定时间内,当系统锁数量达到极限时,发出通知。

你对自己的系统信息收集的越多,在解决问题时,你的优势就越大。

Tim Chapman是肯塔基州路易维尔市一家银行的SQL Server数据库管理员,他有超过7年的行业经验。