![](/img/trans.png)
[英]How do I speed up the batch of update queries over the table with 2 million rows?
[英]Best way to update 40 million rows in batch
基本上我需要在一個有4000萬行的表上運行它,一次更新每一行都會崩潰,所以我想批量查詢,這樣如果它崩潰,它可以重新運行查詢,它會跳過完成的批處理繼續留下剩下的。
UPDATE [table]
SET [New_ID] = [Old_ID]
最快的方法是什么? 以下是創建表的方式:
CREATE TABLE [table](
[INSTANCE_ID] [int] NOT NULL,
[table_ID] [bigint] IDENTITY(1,1) NOT NULL,
[old_ID] [bigint] NOT NULL,
[new_ID] [bigint] NOT NULL,
[owner_ID] [int] NOT NULL,
[created_time] [datetime] NULL
) ON [PRIMARY]
created_time,owner_ID上還有索引。
編輯:我的更新聲明完全如圖所示,我只需要將old_id中的每個條目復制到new_id中以獲得4000萬行。
Declare @Rowcount INT = 1;
WHILE (@Rowcount > 0)
BEGIN
UPDATE TOP (100000) [table] --<-- define Batch Size in TOP Clause
SET [New_ID] = [Old_ID]
WHERE [New_ID] <> [Old_ID]
SET @Rowcount = @@ROWCOUNT;
CHECKPOINT; --<-- to commit the changes with each batch
END
M.Ali的建議會起作用,但是當您處理40M記錄時,最終會降低性能。 我會建議一個更好的過濾器來查找每次傳遞中要更新的記錄。 這將假設您的標識列上有一個主鍵(或其他索引):
DECLARE @Rowcount INT = 1
, @BatchSize INT = 100000
, @StartingRecord BIGINT = 1;
WHILE (@Rowcount > 0)
BEGIN
UPDATE [table]
SET [New_ID] = [Old_ID]
WHERE [table_ID] BETWEEN @StartingRecord AND @StartingRecord + @BatchSize - 1;
SET @Rowcount = @@ROWCOUNT;
CHECKPOINT;
SELECT @StartingRecord += @BatchSize
END
這種方法將允許每次迭代與第一次迭代一樣快。 如果您沒有有效的索引,則需要先修復它。
Select 1; -- this will set a rowcount
WHILE (@@Rowcount > 0)
BEGIN
UPDATE TOP (1000000) [table]
SET [New_ID] = [Old_ID]
WHERE [New_ID] <> [Old_ID]
or ([New_ID] is null and [Old_ID] is not null)
END
100000可能更適合頂部。
由於NewID和OldID不為null,因此不需要進行null檢查。
最快的方法是:
1)創建臨時表,並使用create(select having condition)語句將舊表中的所有值插入到臨時表中。
2)復制約束並刷新索引。
3)放下舊桌子。
4)將臨時表重命名為原始名稱。
此鏈接提供完整的討論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.