2012-12-13 58 views
2

我有一個SSIS包是截斷,然後插入從serverA到serverB整個表,但我想通過在serverB上執行NOLOCK提示選擇查看作業的進度,但它通過SSIS包執行的「BULK INSERT」獲取鎖定。批量插入塊nolock查詢

我檢查了「sys.dm_tran_locks」,發現「BULK INSERT」在表上持有一個「Sch-M」鎖,我不明白爲什麼。

請幫助我嗎?

謝謝。

+0

我知道,但我不明白爲什麼它鎖定架構。我想要一個合理的答案。 – mvillegascuellar

回答

1

截斷要求SCH-M取消分配表allocation units。除此之外,這個鎖具有防止併發髒讀的目的。如果截斷成功釋放表而髒讀取掃描器在其中那些掃描器會突然發現自己閱讀不屬於任何人的頁面(或更糟的是,被重新分配給其他一些AU)。與任何寫入鎖一樣,2PL協議需要保存直到事務結束。後續的髒掃描器會阻擋它,因爲它們應該這樣做。

如果你沒有TRUNCATE/BULK INSERT包裹在一個事務中,那麼還有其他一些可能導致BULK INSERT本身去SCH-M而不是X的場景(我認爲在一張空的表上批量插入的表鎖提示(沒有AU根頁面)會導致這種情況)。

查看BULK INSERT進度的檢查,檢查在sys.allocation_units中有多少頁面分配給您的目標。這會給你一個完成百分比的粗略估計。

+1

非常感謝chear的解釋。 – mvillegascuellar

2

Sch-M鎖定表明目標表上至少有一個索引。

請參見「表鎖定和記錄期間批量導入」:

    http://msdn.microsoft.com/en-us/library/ms177445%28v=sql.105%29.aspx

    基於在參考該表中,SCH-M將被當你散裝插入到用於

  1. 使用具有一個非聚集索引和tablock的堆
  2. 使用空B樹(聚簇索引)和tablock

另外,如果加載正確完成,截斷將在大容量插入開始之前完成(並且它的Sch-M鎖定消失)。

批量更新(BU)鎖是最優化的鎖,但不要指望是批量插入過程中讀取表:

批量更新(BU)鎖允許進程將數據批量複製併發進入同一個表,而阻止非批量複製數據的其他進程訪問表http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

使用Remus建議(sys.allocation_units)檢查進度。

+0

+1該鏈接提供了導致SCH-M的確​​切場景 –