簡體   English   中英

分頁將批量數據插入表中

[英]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個操作( INSERTDELETEUPDATE )在一個事務中,SQL Server將刪除個別行鎖,而是做一個鎖升級 ,而是exlusively鎖定 整個表 -所以沒有其他的操作都可以,直到(可能隱含的事務已提交(或已回滾)。

插入1000行的塊中的部分不應引起鎖升級-但是,當然,在該事務的上下文中插入的任何行都不能同時被另一個事務讀取或操縱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM