科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[SQL Server]了解你的服务器的状态

[SQL Server]了解你的服务器的状态

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

想知道到底哪一个运行T-SQL的连接阻塞了其他的连接?是的,你可以运行sp_who或者查询syslockinfo表,但是如果你想了解更多有关如何调试这个问题的信息怎么办?

作者:IT专家网 来源:IT专家网 2007年9月15日

关键字: 状态 数据库 SQL Server SQL Server 各版本

  • 评论
  • 分享微博
  • 分享邮件
想知道到底哪一个运行T-SQL的连接阻塞了其他的连接?是的,你可以运行sp_who或者查询syslockinfo表,但是如果你想了解更多有关如何调试这个问题的信息怎么办?例如,你如何才能判断阻塞进程运行的是哪一个T-SQL,或者阻塞进程在等待哪一个资源?

  唉,对于老一些版本的SQL Server来说,要获得这些问题的答案可是不易。历史上,数据库管理系统并不是由于它的透明度而被人们所认识。系统表提供了一些可见性,数据库控制台命令(DBCC)提供得多一些,还有更多的是通过各种没有文档的渠道获得。但是要将这些资源集中到一个单个的查询中,即使是回答一个表面化的简单的问题都是一项巨大的工程。

  进入数据库管理视图

  如果你看过我以前写的有关SQL Server 2005 分类视图的贴士,你可以了解系统表在最后一版的数据库管理系统中进行了较大的升级。但是关于这个升级的最有趣的组件是一个叫做“动态管理视图(DMV)”的东西。尽管分类视图允许你检索有关静态数据库对象的信息,例如表和存储过程,动态管理视图却可以展示更多的动态信息。

  现在你可以访问以前只能通过性能计数器访问的信息了;通过使用动态管理视图,你可以发现更多的详细信息,并且用它来做更多的事情。例如,这里有5个与查询计划存储区有关的SQL Server性能计数器,还有更多的几个应用在缓冲存储器上。但是这些计数器是合计的,他们无法告诉你,例如,哪个计划被存储了或者由于每个缓冲存储区条目引起的磁盘I/O的数量。动态管理视图可以。查看sys.dm_exec_cached_plans视图就可以获得有关查询计划存储区的信息,还有sys.dm_os_memory_cache_entries视图可以提供非常具体的缓冲存储区的信息。

  与性能计数器类似,通过动态管理视图检索到的信息也不是你访问当时的最新信息。根据视图的查询情况,这些视图提供的数据每秒钟被更新了数千次。所以阅读并理解一段时间的输出的关键就是取样。如果你需要监控某种条件,那么不要通过动态管理视图来捕捉每个时刻的状态。采用常见的快照来寻找一般的或者变化的趋势。或取少量的数据不但可以帮助你头脑清醒,还可以防止可能让你的服务器崩溃的数据采集。

  使用数据库管理视图

  那么你可以在哪里找到这些权威的视图呢?启动SQL Server Management Studio,打开对象浏览器。找到“主”数据库,然后打开它的视图层次,然后打开系统视图。向下滚动,直到你看到以dm_开头的视图——这些就是动态管理视图了。还可以通过Table-valued函数的形式进入。打开Programmability这个层次,然后在函数下面,系统函数,最终是Table-valued函数。你可以看到有关的动态管理函数。这些函数可以在连接视图的时候用于特殊的帮助任务。

  你要注意的第一件事情就是,动态管理视图是基于他们所属的10个类别命名的。例如,dm_broker视图包含了有关SQL Server Broker(代理)的信息;dm_fts视图显示了可以帮助管理员进行全文本搜索的信息。但是不要认为来自某个分类的视图就不可以加入来自其他分类的信息——这就是动态管理视图的真正强大之处。

  让我们回顾本文早先提到的一个问题:你不但可以判断,一个阻塞进程运行了什么T-SQL,还可以判断这个进程在等待什么?

  从“exec”(execution)视图分类开始,特别是sys.dm_exec_requests视图。通过查看blocking_session_id字段了解阻塞的进程。如果字段是非空的, session_id字段标识的那个会话就是被另一个由blocking_session_id字段标识的会话阻塞了(查看微软在线书籍了解更多详细描述)。现在,回到同一个视图,查询阻塞会话的sql_handle字段的数值。将这个字段作为sys.dm_exec_sql_text函数的输入,检索阻塞了其他进程的T-SQL连接。

  现在,你如何获知被阻塞的资源?跳过“os”(SQLOS)视图分类,查询sys.dm_os_waiting_tasks视图。这个视图恰好拥有一个名为session_id的字段,——惊喜,惊喜——你可以用它来使该行与sys.dm_exec_requests视图的blocking_session_id字段产生关联。

  你如何将其放在一起来找到当前哪个查询阻塞了其他的查询,还有他们在等待什么资源?以下的查询是一个不错的起始点。

  SELECT

  blocked_query.session_id AS blocked_session_id,

  blocking_query.session_id AS blocking_session_id,

  sql_text.text AS blocking_text,

  waits.wait_type AS blocking_resource

  FROM sys.dm_exec_requests blocked_query

  JOIN sys.dm_exec_requests blocking_query ON

  blocked_query.blocking_session_id = blocking_query.session_id

  CROSS APPLY

  (

  SELECT *

  FROM sys.dm_exec_sql_text(blocking_query.sql_handle)

  ) sql_text

  JOIN sys.dm_os_waiting_tasks waits ON

  waits.session_id = blocking_query.session_id

  很遗憾,本文篇幅所限,只能略为涉及动态管理视图提供的强大功能的皮毛。关注本网站,阅读后续的贴士,里面包含更多有深度的场景,它可以帮助你追踪微妙的性能和利用率问题。与此同时,开始探索吧!数据库管理系统内部工作机制的这种级别的可见度对于SQL Server数据库管理员们来说,可是一个新的景象,这些信息可以加以无穷的利用。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章