2015-08-30 51 views
1

我可以查看我們的生產數據庫中的阻塞會話。SQL阻止會話是否會自行清除?

SELECT * FROM sys.sysprocesses WHERE spid = YOURSPID 

我沒有殺過會話:Kill <SPID>

是否阻塞會話將得到明確的本身?

+0

鬆散的聯繫,但使用'sp_whoisactive'更多的信息和更多的人類可讀。 – lad2025

+0

*「阻塞會話會自行清除嗎?」*只要會話合法活動, – sstan

+0

我被告知要使用:beta_lockinfo。我是否也可以從此語法中看到活動用戶?我可以殺死阻止會話的活動用戶嗎?我認爲我只會看到活躍的用戶。 – goofyui

回答

1

它取決於活動的用戶(如果有)以及誰(如果有的話)正在執行查詢。如果有任何活動用戶阻止了會話,那麼您必須爲該用戶終止會話,否則等待他/他的會話完成。您可以執行sp_whoisactive來檢查活動用戶的列表。並檢查是否有任何用戶阻止會話,然後您可以顯式終止該用戶的會話以使其工作。您可以參考:Identify the cause of SQL Server blocking

該查詢是分析有關 鎖的詳細信息,並幫助您找出大量塊的事業的好方法。

WITH [Blocking] 
AS (SELECT w.[session_id] 
    ,s.[original_login_name] 
    ,s.[login_name] 
    ,w.[wait_duration_ms] 
    ,w.[wait_type] 
    ,r.[status] 
    ,r.[wait_resource] 
    ,w.[resource_description] 
    ,s.[program_name] 
    ,w.[blocking_session_id] 
    ,s.[host_name] 
    ,r.[command] 
    ,r.[percent_complete] 
    ,r.[cpu_time] 
    ,r.[total_elapsed_time] 
    ,r.[reads] 
    ,r.[writes] 
    ,r.[logical_reads] 
    ,r.[row_count] 
    ,q.[text] 
    ,q.[dbid] 
    ,p.[query_plan] 
    ,r.[plan_handle] 
FROM [sys].[dm_os_waiting_tasks] w 
INNER JOIN [sys].[dm_exec_sessions] s ON w.[session_id] = s.[session_id] 
INNER JOIN [sys].[dm_exec_requests] r ON s.[session_id] = r.[session_id] 
CROSS APPLY [sys].[dm_exec_sql_text](r.[plan_handle]) q 
CROSS APPLY [sys].[dm_exec_query_plan](r.[plan_handle]) p 
WHERE w.[session_id] > 50 
    AND w.[wait_type] NOT IN ('DBMIRROR_DBM_EVENT' 
     ,'ASYNC_NETWORK_IO')) 
SELECT b.[session_id] AS [WaitingSessionID] 
     ,b.[blocking_session_id] AS [BlockingSessionID] 
     ,b.[login_name] AS [WaitingUserSessionLogin] 
     ,s1.[login_name] AS [BlockingUserSessionLogin] 
     ,b.[original_login_name] AS [WaitingUserConnectionLogin] 
     ,s1.[original_login_name] AS [BlockingSessionConnectionLogin] 
     ,b.[wait_duration_ms] AS [WaitDuration] 
     ,b.[wait_type] AS [WaitType] 
     ,t.[request_mode] AS [WaitRequestMode] 
     ,UPPER(b.[status]) AS [WaitingProcessStatus] 
     ,UPPER(s1.[status]) AS [BlockingSessionStatus] 
     ,b.[wait_resource] AS [WaitResource] 
     ,t.[resource_type] AS [WaitResourceType] 
     ,t.[resource_database_id] AS [WaitResourceDatabaseID] 
     ,DB_NAME(t.[resource_database_id]) AS [WaitResourceDatabaseName] 
     ,b.[resource_description] AS [WaitResourceDescription] 
     ,b.[program_name] AS [WaitingSessionProgramName] 
     ,s1.[program_name] AS [BlockingSessionProgramName] 
     ,b.[host_name] AS [WaitingHost] 
     ,s1.[host_name] AS [BlockingHost] 
     ,b.[command] AS [WaitingCommandType] 
     ,b.[text] AS [WaitingCommandText] 
     ,b.[row_count] AS [WaitingCommandRowCount] 
     ,b.[percent_complete] AS [WaitingCommandPercentComplete] 
     ,b.[cpu_time] AS [WaitingCommandCPUTime] 
     ,b.[total_elapsed_time] AS [WaitingCommandTotalElapsedTime] 
     ,b.[reads] AS [WaitingCommandReads] 
     ,b.[writes] AS [WaitingCommandWrites] 
     ,b.[logical_reads] AS [WaitingCommandLogicalReads] 
     ,b.[query_plan] AS [WaitingCommandQueryPlan] 
     ,b.[plan_handle] AS [WaitingCommandPlanHandle] 
FROM [Blocking] b 
INNER JOIN [sys].[dm_exec_sessions] s1 
ON b.[blocking_session_id] = s1.[session_id] 
INNER JOIN [sys].[dm_tran_locks] t 
ON t.[request_session_id] = b.[session_id] 
WHERE t.[request_status] = 'WAIT' 
GO 
+0

謝謝。你說有Active和InActive用戶將顯示在該查詢執行結果? – goofyui

+0

@goofyui: - 更新了我的答案! –