程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 監控SQL Server的運行狀況(3)

監控SQL Server的運行狀況(3)

編輯:關於SqlServer

阻塞

運行下面的查詢可確定阻塞的會話。

  1. select blocking_session_id, wait_duration_ms, session_id from
  2. sys.dm_os_waiting_tasks
  3. where blocking_session_id is not null

使用此調用可找出 blocking_session_id 所返回的 SQL。例如,如果 blocking_session_id 是 87,則運行此查詢可獲得相應的 SQL。

  1. dbcc INPUTBUFFER(87)

下面的查詢顯示 SQL 等待分析和前 10 個等待的資源。

  1. select top 10 *
  2. from sys.dm_os_wait_stats
  3. --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
  4. order by wait_time_ms desc

若要找出哪個 spid 正在阻塞另一個 spid,可在數據庫中創建以下存儲過程,然後執行該存儲過程。此存儲過程會報告此阻塞情況。鍵入 sp_who 可找出 @spid;@spid 是可選參數。

  1. create proc dbo.sp_block (@spid bigint=NULL)
  2. as
  3. select
  4. t1.resource_type,
  5. 'database'=db_name(resource_database_id),
  6. 'blk object' = t1.resource_associated_entity_id,
  7. t1.request_mode,
  8. t1.request_session_id,
  9. t2.blocking_session_id
  10. from
  11. sys.dm_tran_locks as t1,
  12. sys.dm_os_waiting_tasks as t2
  13. where
  14. t1.lock_owner_address = t2.resource_address and
  15. t1.request_session_id = isnull(@spid,t1.request_session_id)

以下是使用此存儲過程的示例。

  1. exec sp_block
  2. exec sp_block @spid = 7
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved