[英]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.