mutex_instances
表列出了服务器执行期间性能模式看到的所有互斥锁。互斥锁是代码中使用的一种同步机制,用于确保在给定时间只有一个线程可以访问某些公共资源。据说该资源受到互斥锁的““保护””。
当在服务器中执行的两个线程(例如,同时执行查询的两个用户会话)确实需要访问同一个资源(文件、缓冲区或某些数据)时,这两个线程会相互竞争,因此第一个获取互斥锁上的锁的查询会导致另一个查询等待,直到第一个查询完成并解锁互斥锁。
持有互斥锁时执行的工作被称为在““临界区””中,并且多个查询确实以序列化方式(一次一个)执行此临界区,这可能成为瓶颈。
mutex_instances
表具有以下列:
NAME
与互斥锁关联的检测点名称。
OBJECT_INSTANCE_BEGIN
内存中检测到的互斥锁的地址。
LOCKED_BY_THREAD_ID
当某个线程当前已锁定互斥锁时,
LOCKED_BY_THREAD_ID
是锁定线程的THREAD_ID
,否则为NULL
。
mutex_instances
表具有以下索引:
在 (
OBJECT_INSTANCE_BEGIN
) 上的主键在 (
NAME
) 上的索引在 (
LOCKED_BY_THREAD_ID
) 上的索引
不允许对 mutex_instances
表执行 TRUNCATE TABLE
。
对于代码中检测到的每个互斥锁,性能模式都提供以下信息。
setup_instruments
表列出了检测点的名称,前缀为wait/synch/mutex/
。当某些代码创建互斥锁时,会将一行添加到
mutex_instances
表中。OBJECT_INSTANCE_BEGIN
列是唯一标识互斥锁的属性。当一个线程尝试锁定互斥锁时,
events_waits_current
表会显示该线程的一行,指示它正在等待互斥锁(在EVENT_NAME
列中),并指示正在等待哪个互斥锁(在OBJECT_INSTANCE_BEGIN
列中)。当一个线程成功锁定互斥锁时
events_waits_current
显示对互斥锁的等待已完成(在TIMER_END
和TIMER_WAIT
列中)完成的等待事件将添加到
events_waits_history
和events_waits_history_long
表中mutex_instances
显示互斥锁现在由该线程拥有(在THREAD_ID
列中)。
当一个线程解锁互斥锁时,
mutex_instances
显示该互斥锁现在没有所有者(THREAD_ID
列为NULL
)。当互斥锁对象被销毁时,
mutex_instances
中的对应行将被删除。
通过对以下两个表执行查询,监控应用程序或 DBA 可以检测涉及互斥锁的线程之间的瓶颈或死锁:
events_waits_current
,用于查看线程正在等待哪个互斥锁。mutex_instances
,用于查看当前哪个线程拥有互斥锁。