特にテーブルが大きくなったり、多くの行を更新する必要がある場合は、テーブルのセットベースの処理が常に RBAR よりも優先されるべきであるというのが従来の知恵です。
しかし、それは常に成り立ちますか?私はさまざまなハードウェアで、同じワークロードをより小さなチャンクに分割すると直線的に増加する一方で、セットベースの処理では時間消費が指数関数的に増加する状況をかなり多く経験しました。
完全に間違っていることが証明されるのは興味深いことだと思います-明らかな何かが欠けている場合-または、そうでない場合は、ワークロードを分割することがいつ努力する価値があるかを知ることは非常に良いでしょう. その後、どの指標を使用するかを決定するのに役立つ指標を特定します。個人的には、次のコンポーネントが興味深いと期待しています。
- ワークロードのサイズ
- ログファイルのサイズと増大
- RAMの量
- ディスクシステムの速度
他の?CPU/CPU コアの数?
例 1: 1,200 万行のテーブルがあり、各行の 1 つまたは 2 つのフィールドを別のテーブルのデータで更新する必要があります。これを 1 回の簡単な更新で行うと、テスト ボックスで 30 分ほどかかります。しかし、これを 12 個のチャンクに分割すると、約 24 分で完了します。
WHERE <key> BETWEEN 0 AND 1000000
WHERE <key> BETWEEN 1000000 AND 2000000
...
例 2: 実質的にすべての行に対していくつかの計算を行う必要がある 2 億行以上のテーブルです。フルセットをオールインワンで実行すると、私のボックスは 3 日間稼働し、それでも完了しません。まったく同じ SQL を実行する単純な C# を作成し、トランザクション サイズを一度に 10 万行に制限するために WHERE 句を追加すると、約 14 時間で完了します。
記録のために:私の結果は、同じデータベースからのもので、同じ物理ハードウェア上にあり、統計が更新され、インデックスに変更はなく、単純な復旧モデルなどがあります。
いいえ、「真の」RBAR を試したことはありませんが、実際にどれくらいの時間がかかるかを確認するためだけに試したほうがよいでしょう。