[英]Paging Insert bulk data into a table
也許這是一個愚蠢的問題,但是如何拆分/分頁插入以讓其他操作更新同一張表。
我有兩個存儲過程,一個存儲過程可插入批量數據
存儲過程InsertIntoMyTable
:
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM MyOtherTable
MyTable
主鍵是(Column1, Column2)
並且對同一表MyTable
進行MERGE
操作,但從另一個來源進行,主要是更新(column3),但也可以將數據插入MyTable
。
問題是,當MyTable
上的插入花費大量時間1000萬條記錄時,執行MERGE
的存儲過程必須等到InsertIntoMyTable
完成。
嘗試解決此問題時,添加了分頁
DECLARE @Start INT = 1
DECLARE @End INT = 1000
DECLARE @Amount INT = 1000
DECLARE @Total INT
SELECT @Total = COUNT(Column1) FROM MyOtherTable WHERE Column2 = @Column2
WHILE (@Start<=@Total)
BEGIN
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM (SELECT
Column1,
Row_number() OVER(ORDER BY Column1) rownumber
FROM MyOtherTable
WHERE Column2 = @Column2) x
WHERE x.rownumber between @start and @end
SET @start = @end+1
SET @End = @End + @Amount
END
但仍會鎖定表,直到操作結束。
注意:執行不在事務中。
執行是在事務中進行的-如果您自己不提供顯式事務,則SQL Server將使用隱式事務。
如果你有超過5000個操作( INSERT
, DELETE
, UPDATE
)在一個事務中,SQL Server將刪除個別行鎖,而是做一個鎖升級 ,而是exlusively鎖定 整個表 -所以沒有其他的操作都可以,直到(可能隱含的事務已提交(或已回滾)。
插入1000行的塊中的部分不應引起鎖升級-但是,當然,在該事務的上下文中插入的任何行都不能同時被另一個事務讀取或操縱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.