您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_object_stats

语法


sp_object_stats <interval>[, <top_n>[, <dbname>, <objname>[, <rpt_option>]]]

参数

<interval>

指定采样的时间范围。必须采用 HH:MM:SS 格式,例如“00:20:00”。

`<top_n></p> <p>是要报告的对象的数目,按争用顺序。缺省值为 10。</p> <p><dbname></p> <p>是要报告的数据库的名称。如果没有给出数据库名,则报告所有数据库中对象的争用情况。</p> <p><objname></p> <p>是要报告的表的名称。如果指定了表名,则也必须指定数据库名。</p> <p><rpt_option>`

指定报告类型:

  • rpt_locks 报告争用程度最高的表的授予数、等待数、死锁数和等待时间。rpt_locks 为缺省值。

  • rpt_objlist 只报告具有最高级别锁活动的对象名。

    示例

    示例 1

    报告有关服务器范围内前 10 个对象的锁统计信息:

    
    sp_object_stats "00:20:00"
    

    示例 2

    只报告 pubtune 数据库中的表,并且列出争用程度最高的 5 个表:

    
    sp_object_stats "00:20:00", 5, pubtune
    

    示例 3

    只显示具有最高锁定活动的表的名称,即使争用和死锁情况并未发生:

    
    sp_object_stats "00:15:00", @rpt_option = "rpt_objlist"
    

    用法

    使用 sp_object_stats 时,还存在一些其它注意事项:

  • sp_object_stats 报告指定采样期间在表上获取的共享锁、更新锁和排它锁的有关信息。以下报告显示 titles 表:

    
    Object Name: pubtune..titles (dbid=7, objid=208003772,lockscheme=Datapages)
    
      Page Locks     SH_PAGE                UP_PAGE               EX_PAGE$
      ----------    ----------             ----------            ----------
      Grants:         94488                  4052                  4828
      Waits:               532                    500                   776
      Deadlocks:             4                      0                    24
      Wait-time:      20603764 ms           14265708 ms           2831556 ms
      Contention:         0.56%                 10.98%                13.79%
    
     *** Consider altering pubtune..titles to Datarows locking.
    

    这些值的含义为:

    - Grants – 立即授予锁的次数。

    - Waits – 需要锁的任务要等待的次数。

    - Deadlocks – 发生死锁的数目。

    - Wait-time – 所有任务在等待锁时所用的总毫秒数。

    - Contention – 任务必须等待或遇到死锁的次数所占的百分比。

  • sp_object_stats 建议当表中的总争用大于 15% 时改变锁定方案,具体如下:

    - 如果表采用全页锁定,建议改为数据页锁定。

    - 如果表使用数据页锁定,建议改为数据行锁定。

  • 首次执行 sp_object_stats 时,将在内部启用跟踪标志 1213,并在过程完成时将其禁用。如果在完成前取消系统过程,必须检查跟踪标志 1213 是否仍然处于启用状态,然后使用 dbcc traceoff 手动将其禁用:

    
    dbcc traceoff (1213)
    

    发出此查询以确定当前是否已设置跟踪标志 1213:

    
    select * from sysoptions where number = 1213
    

  • sp_object_stats 创建一个名为 tempdb..syslkstats 的表。该表在存储过程完成后不会删除,因此系统管理员可以使用 Transact-SQL 对其进行查询。

  • 一次只应有一个用户执行 sp_object_stats。如果多个用户尝试同时运行 sp_object_stats,则第二个命令可能会被阻塞,否则结果可能无效。

  • 每次执行 sp_object_stats 后,tempdb..syslkstats 表都会被删除并重新创建。

  • tempdb..syslkstats 的结构为:

    列名 数据类型 说明
    dbid smallint 数据库 ID
    objid int 对象 ID
    lockscheme smallint 整数值 1-3:
    1 – 全页(数据页和索引页)
    2 – 数据页
    3 – 数据行
    page_type smallint 0 – 数据页
    1 – 索引页
    stat_name char(30) 由此行表示的统计信息
    stat_name 列中的值由以下三部分组成:
    第一部分是 "ex"、"sh" 或 "up",分别表示排它锁、共享锁或更新锁。
    第二部分是 "pg" 或 "row",分别表示页锁或行锁。
    第三部分是 "grants"、"waits"、"deadlocks" 和 "waittime",分别表示立即授予的锁、需要等待释放其它锁的锁、死锁或为获取锁而等待的时间。
    stat_value float 授予、等待或死锁的数目,或者总等待时间。

  • 如果您指定一个表名,则 sp_object_stats 显示该名称的所有表。如果多个用户拥有具有指定名称的表,则这些表的输出将显示对象 ID,而不是所有者名。