大規模なデータベースを使用していますが、選択/更新を最適化する方法についてアドバイスが必要です。これが例です:
create table Book (
BookID int,
Description nvarchar(max)
)
-- 8 million rows
create table #BookUpdates (
BookID int,
Description nvarchar(max)
)
-- 2 million rows
800万冊の本があり、そのうち200万冊のジャンルを更新する必要があると仮定します。
問題:これらの更新を実行する時間は非常に長いです。これにより、データベースからステートメントを実行しようとしているユーザーがブロックされることがあります。私は解決策を考え出しましたが、そこにもっと良いものがあるかどうか知りたいです。私はこのような1回限りのランダムな更新をたくさん準備する必要があります(何らかの理由で)
-- normal update
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
-- batch update
while (@BookID < @MaxBookID)
begin
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
where bu.BookID >= @BookID
and bu.BookID < @BookID + 5000
set @BookID = @BookID + 5000
end
2番目の更新ははるかに高速に動作します。このソリューションが気に入っているのは、ステータスの更新を残りの期間について自分自身に印刷でき、お客様のパフォーマンスの問題を引き起こさないためです。
質問:ここで重要な何かが欠けていますか?一時テーブルのインデックス?
正規化コメントが増えないように、EXAMPLEテーブルを更新しました。本ごとに1つの説明のみ:)