簡體   English   中英

大表上的簡單 UPDATE 查詢性能不佳

[英]simple UPDATE query on large table has bad performance

我需要通過存儲過程執行以下更新查詢:

UPDATE table1
SET name = @name (this is the stored procedure inputparameter)
WHERE name IS NULL

表 1 沒有索引或鍵,5 列是 4 個整數和 1 個 varchar(可更新列 'name' 是 varchar 列)

NULL 記錄大約有 15.000.000 行需要更新。 這大約需要 50 分鍾,我認為這太長了。

我正在運行 Azure SQL DB 標准 S6(400DTU)。

任何人都可以給我建議以提高性能嗎?

由於您沒有任何密鑰或索引,我可以建議以下方法。

1-使用INTO (將復制數據)創建一個新表,如下面的查詢。

  SELECT 
       CASE 
              WHEN NAME IS NULL THEN @name 
              ELSE NAME 
       END AS NAME, 
       <other columns > 
INTO   dbo.newtable
FROM table1

2-放下舊桌子

drop table table1

3-將新表重命名為table1

exec sp_rename 'dbo.newtable', 'table1'

另一種方法可以是使用批量更新,有時與批量更新相比,您可以獲得更好的性能(您需要通過調整批量大小進行測試)。

WHILE EXISTS (SELECT 1 FROM table1 WHERE name is null)
BEGIN
    UPDATE TOP (10000) table1
    SET name = @name
    WHERE n ame is null
END

您只需要一個INDEX via

       Create INDEX I1 ON table1(P_key)

然后,運行您的更新查詢。 這將有助於基於作為現有表中索引的某些唯一/鍵列快速檢索和更新記錄。

你能用以下方法嗎?

UPDATE table1
SET name = ISNULL(name,@name)

對於null值,它將使用@name更新,rest將使用相同的值進行更新。

不。您要更新15,000,000行,這需要很長時間。 每次更新都有查找行和記錄值的開銷。

有了這么多行要更新,開銷就不太可能找到行。 如果在name上添加索引,則更新實際上必須更新索引以及更新原始值。

如果你擔心鎖定數據庫,你可以設置一個循環,你可以反復執行這樣的操作:

UPDATE TOP (100000) table1
    SET name = @name (this is the stored procedure inputparameter)
    WHERE name IS NULL;

100,000行應約為30秒左右。

在這種情況下, name 的索引確實有幫助。 否則,循環的每次迭代本質上都是讀取整個表。

暫無
暫無

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

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