簡體   English   中英

SQL 服務器 2016 - 批處理 select 並在表之間插入數據

[英]SQL Server 2016 - Batch select and insert data between tables

我的任務是在 2 個表之間復制數據,並且由於較小的集合是 4000 萬條記錄(最大的幾乎是 100 倍),所以我正試圖以較小的批次打破集合。

在我的測試結束時,我會將邏輯放入 SSIS 任務中,但到目前為止,我無法進行 while 循環.. 循環,它寫入第一批然后退出。

我的表有一個 PK 我用於訂單和偏移量 function 但是使用過濾器,返回的 ID 不連續,所以我不確定分頁 function 是否正常工作。

聲明是這樣的:

DECLARE @RowsProcessed int = 0;
DECLARE @Batch int = 100000;
DECLARE @RowCount int = 1;
DECLARE @String AS INT = 13

WHILE @RowCount!= 0
BEGIN
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1
    (
... )
    SELECT
    *
    FROM
        Table2
    WHERE
    Filter1 = @String
ORDER BY
    ID
OFFSET @RowsProcessed ROWS 
FETCH NEXT @Batch ROWS ONLY
SET IDENTITY_INSERT Table1 OFF
SET @RowCount =  @@ROWCOUNT
PRINT @RowCount 
SET @RowsProcessed += @Batch
END'

我的想法是分塊讀取數據,因為源表非常大,我想限制 tempdb 的問題,但我無法找到解決非連續 ids 問題的方法,除非使用 CTE 和RANK OVER,但我認為這需要掃描所有表,我錯了嗎?

提前感謝您的任何建議,任

SET @RowCount = @@ROWCOUNT需要更早,緊跟在插入之后,在SET IDENTITY_INSERT Table1 OFF之前

非常感謝@Charlieface,我不知道SET IDENTITY_INSERT會干擾 Rowcount 變量。 真的謝謝!

至於@NielsBerglund:我需要將一組無序過濾數據從大表復制到小表(可能使用SSIS 中的上述邏輯)。 最后,我將復制所有表,並對某些特殊類型的行進行一些修改。 我試圖找到一種方法,不在單個事務中處理 select 40bln 記錄,而在我看來,OFFSET FETCH 似乎是實現它的最佳方法。

再次感謝,

暫無
暫無

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

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