Sql-Server

什麼可以阻止更新和插入表而沒有任何明顯的阻塞過程?

  • May 13, 2020

以下情況不止一次發生。

對某個表的更新或插入(我不是 100% 確定,但似乎總是碰巧有幾個表)由於超時而失敗。如果我從 Management Studio 執行相同的查詢,它只會繼續執行而不會結束或失敗(有一次我讓它嘗試長達一個小時)。

SSMS 的活動監視器,以及sp_who2不顯示程序被任何東西阻止。它似乎執行沒有問題,除了它沒有做任何事情或結束。

如果只有一行被更新,由其主鍵選擇,這也是一樣的;據我所知,這不是影響許多行的查詢或難以“找到”該行的問題。

我試圖在這裡尋找其他問題並使用Google,但所有這些問題似乎都指向程序被 可見的其他東西阻止sp_who2,但這裡不是這種情況。

**編輯 2015-12-15:**問題再次出現,這次我也能跑sp_whoisactive了。它顯示了我的過程,但wait_infoblocking_session_id列中沒有任何內容。它返回的數據如下(敏感資訊已刪除):

dd hh:mm:ss.mss: 00 00:00:29.016
session_id: 85
sql_text: <?query --
insert into MSmerge_cpmv_66969A68BA3C4DFE9CFC3A88E87970FD (publication_number, tablenick, rowguid, partition_id)
           select distinct 1, @tablenick, bt.rowguid, bt.partition_id
           from (  select [BlockedTable].[blocked_table_id], [BlockedTable].[for_replication], [BlockedTable].[rowguid], msp.partition_id from inserted [BlockedTable] , dbo.MSmerge_partition_groups msp where  (msp.publication_number = 1 and ( ((blocked_table_id in (select blocked_table_id from dbo.GetFilteredIDsForUser(msp.[SUSER_NAME_FN] )) and for_replication = 1)) )) ) as bt 

--?>
login_name: MyUserName
wait_info: NULL
CPU: 28,813
tempdb_allocations: 0
tempdb_current: 0
blocking_session_id: NULL
reads: 25,507,251
writes: 9
physical_reads: 0
used_memory: 3
status: runnable
open_tran_count: 2
percent_complete: NULL
host_name: MyHostName
database_name: MyDatabaseName
program_name: .Net SqlClient Data Provider
start_time: 2015-12-15 10:44:49.200
login_time: 2015-12-15 10:44:49.183
request_id: 0
collection_time: 2015-12-15 10:45:18.237

我可能不明白如何閱讀 的輸出sp_whoisactive,但我沒有找到任何相關資訊。此處的現有答案(截至 2015 年 12 月 15 日)解釋瞭如何收集數據以及如何修復阻塞,但沒有解釋如何讀取輸出。

輸出中顯示的查詢似乎意味著它無法在我們的合併發布的分區中插入新數據。發佈設置為預先計算分區。難道這就是阻礙它的原因嗎?

還有什麼可能以這種方式阻止查詢?

reads: 25,507,251
writes: 9
start_time: 2015-12-15 10:44:49.200
collection_time: 2015-12-15 10:45:18.237

您的會話未被阻止。在應用任何寫入之前,它只需要進行大量讀取。大數據,可能是像排序或 HT 這樣的阻塞運算符。它可能還沒有到 INSERT 部分。

這是基本的性能問題。從如何分析 SQL Server 性能開始。

PS。這是笛卡爾連接嗎?

from inserted [BlockedTable] , dbo.MSmerge_partition_groups msp 
where  (msp.publication_number = 1 and ( 
  ((blocked_table_id in (... )) and for_replication = 1)) )) 

我更喜歡使用以下 2 中的任何一個而不是 SP_who2 或活動監視器來跟踪阻塞:

  1. 使用由 Adam Machanic 編寫的程序Sp_whoisactive 。創建後,您可以使用以下方法收集數據以分析阻塞:

一種。創建一個目標表

b.創建循環以定期記錄數據

c. 設置查詢以查看結果

關於如何獲取這些詳細資訊,請閱讀此處

  1. 您可以使用Michael.J swart 編寫的SQL Server Blocked Process Report Viewer ,它可以幫助您分析以非常有用的方式導致的阻塞根。

您可以閱讀文章好的,您已經發現阻塞,現在怎麼辦?以獲得更詳細的資訊。

希望這兩個會有所幫助,因為他們已經為我們服務了很長時間。

引用自:https://dba.stackexchange.com/questions/116999