找出是否存在一个或多个等待获取 tempdb 中页面锁存器的线程

SELECT session_id,wait_type, wait_duration_ms, resource_description
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGE%LATCH_%' AND resource_description LIKE '2:%'

 

下面DMV查询来确认 tempdb 中当前引发最多分配和回收操作的执行查询

SELECT TOP 10
      t1.session_id, t1.request_id, t1.task_alloc, t1.task_dealloc,t2.plan_handle,
      (SELECT SUBSTRING(text, t2.statement_start_offset/2 + 1,
            (CASE WHEN statement_end_offset = -1
                  THEN LEN(CONVERT(nvarchar(MAX), text)) * 2
                  ELSE statement_end_offset
            END - t2.statement_start_offset)/2)
      FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM (SELECT session_id, request_id,
            SUM(internal_objects_alloc_page_count +
            user_objects_alloc_page_count) AS task_alloc,
            SUM(internal_objects_dealloc_page_count +
            user_objects_dealloc_page_count) AS task_dealloc
      FROM sys.dm_db_task_space_usage
      GROUP BY session_id, request_id) AS t1,
      sys.dm_exec_requests AS t2
WHERE t1.session_id = t2.session_id AND
      (t1.request_id = t2.request_id) AND t2.session_id > 50
ORDER BY t1.task_alloc DESC

 

下面DMV查询找出当前执行事务或当前执行事务等待的锁

SELECT request_session_id AS spid, resource_type AS rt,resource_database_id AS rdb,
      (CASE resource_type
            WHEN 'OBJECT' THENobject_name(resource_associated_entity_id)
            WHEN 'DATABASE' THEN ' '
            ELSE (SELECT object_name(object_id) FROM sys.partitionsWHERE hobt_id=resource_associated_entity_id)
      END) AS objname,
      resource_description as rd,
      request_mode as rm,
      request_status AS rs
FROM sys.dm_tran_locks

 

下面查询得到正在被阻塞的查询

--request_mode表示查询要请求的锁,resource_description中的mode=x表示该查询被阻塞的锁
SELECT
      t1.resource_type,
      'database' = DB_NAME(resource_database_id),
      'blk object' = t1.resource_associated_entity_id,
      t1.request_mode,
      t1.request_session_id,
      t2.blocking_session_id,
      t2.wait_duration_ms,
      (SELECT SUBSTRING(text, t3.statement_start_offset/2+1,
            (CASE WHEN t3.statement_end_offset = -1 THENLEN(CONVERT(nvarchar(max), text)) * 2
            ELSE t3.statement_end_offset END -t3.statement_end_offset)/2)
      FROM sys.dm_exec_sql_text(sql_handle)) AS query_text,
      t2.resource_description
FROM sys.dm_tran_locks AS t1, sys.dm_os_waiting_tasks AS t2,sys.dm_exec_requests AS t3
WHERE t1.lock_owner_address = t2.resource_address AND
      t1.request_request_id = t3.request_id AND
      t2.session_id = t3.session_id

 

下面查询返回表的索引被使用的情况

SELECT index_id, range_scan_count, row_lock_count, page_lock_count
FROM sys.dm_db_index_operational_stats(DB_ID('<db name>'),OBJECT_ID('table name'), NULL, NULL)
posted on 2011-04-18 11:29  ideas  阅读(500)  评论(0编辑  收藏  举报