sql serverはどのようにupdateデータを一括します
1508 ワード
理由:
一度に2千万件のデータをupdateするには、update sqlは簡単ですが、一度に多くのデータを変更したため、データベースのlogがいっぱいになり、errorに報告します.
[ErrorCode: 9002, SQL State: S0004] The transaction log for database'XXXXData' is full. To find out why space in the log cannot be reused, seethe log_reuse_wait_desc column in sys.databases
したがって、
データベースが一度にupdateデータ操作するので、大量のupdateデータが思い浮かぶ.私が考えることができる解決策は、ページクエリsqlのように、updateごとに一定数のデータ(トランザクションコミット)があることです.
では、私のupdate scriptは次のように実現されます.
もし、皆さん、他に、はい、簡単な解決策があれば、分かち合ってください~~~~
一度に2千万件のデータをupdateするには、update sqlは簡単ですが、一度に多くのデータを変更したため、データベースのlogがいっぱいになり、errorに報告します.
[ErrorCode: 9002, SQL State: S0004] The transaction log for database'XXXXData' is full. To find out why space in the log cannot be reused, seethe log_reuse_wait_desc column in sys.databases
したがって、
データベースが一度にupdateデータ操作するので、大量のupdateデータが思い浮かぶ.私が考えることができる解決策は、ページクエリsqlのように、updateごとに一定数のデータ(トランザクションコミット)があることです.
では、私のupdate scriptは次のように実現されます.
DECLARE
@pagesize INT,
@pages INT,
@offset INT,
@maxresult INT
select @pagesize=100000, @pages=1
-- 1 prepare data list
CREATE TABLE #Tbl_Affected_ID
(
id INT NOT NULL,
rowNum INT NOT NULL,
modified CHAR(1) DEFAULT 'N' NOT NULL
)
INSERT
#Tbl_Affected_ID(id, rowNum)
SELECT
aa.id,
ROW_NUMBER() OVER(ORDER BY aa.id) AS rowNum
FROM
TBLxxx aa
WHERE userId is null '?'
-- 2 batch update
WHILE exists( select 1 from #Tbl_Affected_ID where modified = 'N')
BEGIN
select @offset = (@pages-1) * @pagesize
select @maxresult = @offset + @pagesize
begin tran
UPDATE TBLxxx SET
userId = 'test_user'
from #Tbl_Affected_ID tmp
WHERE
tmp.id = TBLxxx.id
and rowNum between @offset and @maxresult
UPDATE #Tbl_Affected_ID SET
modified = 'Y'
WHERE
rowNum between @offset and @maxresult
commit tran
select @pages = @pages+1
END
もし、皆さん、他に、はい、簡単な解決策があれば、分かち合ってください~~~~