dm_db_index_operational_stats 显示比扩展事件报告更多的阻塞

Ste*_*eez 2 sql-server extended-events blocking

我已经实现了 XE 来捕获我的实例上的阻塞(根据这篇很棒的文章https://www.brentozar.com/archive/2014/03/extended-events-doesnt-hard/#comment-2470072。)

我这样做是因为我一直关注阻塞状态,使用查询的这种美:

select 
   db_name(database_id) DB, 
   object_name(object_id) Obj, 
   row_lock_count + page_lock_count No_Of_Locks, 
   row_lock_wait_count + page_lock_wait_count No_Of_Blocks, 
   row_lock_wait_in_ms + page_lock_wait_in_ms Block_Wait_Time_in_ms, 
   index_id
from 
   sys.dm_db_index_operational_stats(NULL,NULL,NULL,NULL) 
order by 
   Block_Wait_Time_in_ms desc
Run Code Online (Sandbox Code Playgroud)

偶尔会在文件中记录一些阻塞,但没有我预期的那么多。我的期望是查询中 No_Of_blocks 中的数字将与根据 XE 记录到文件中的块数相对应。

与查询相比,XE 是否可能无法捕获任何内容?有任何想法吗?感谢您的反馈意见!

Sql*_*ide 5

您正在比较无法比较的完全不同的事物。

XE 跟踪您正在捕获一个称为此处sqlserver.blocked_process_report描述的事件。

在这里,您正在捕获超过固定时间的所有类型的阻塞。如果它小于该持续时间(由 设置sp_configure 'blocked process threshold'),它将不会被此事件捕获。

Blocked Process Report 事件类指示任务已被阻止超过指定的时间量。此事件类不包括系统任务或等待不可检测到死锁的资源的任务。

您的第二个集合dm_db_index_operational_stats仅使用计数等待行和页锁定。它也是累积的,因为堆或索引的元数据被带入元数据缓存并且统计信息被累积,直到缓存对象从元数据缓存中移除。

详情请见:https : //docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-index-operational-stats-transact-sql

  • row_lock_wait_count:数据库引擎等待行锁的累积次数。
  • page_lock_wait_count:数据库引擎等待页面锁定的累积次数。