この質問にアプローチする最善の方法は、400 万のレコードをテーブルに挿入することです。実際、ビューに「一括挿入」することで、ID 列を持つテーブルにそれらを配置できます。
テーブル TheIds を作成 (rownum int identity(1,1), id int); ビュー v_TheIds を作成 (TheIds から ID を選択); v_TheIds に一括挿入します。 . .コード> プレ>
データベースにすべてのデータがあるため、さらに多くのオプションがあります。アップデートを試してください:
update t set booleanfield =1 where exists (TheIds where TheIds.id =t.id から 1 を選択)
プレ>
TheIds(id)
にもインデックスを作成する必要があります .
これは大規模な更新であり、すべてが 1 つのトランザクションとして実行されます。これにより、パフォーマンスが低下し、ログがいっぱいになり始める可能性があります。 rownum
を使用して、より小さなトランザクションに分割できます 列:
update t set booleanfield =1 where exists (TheIds.id =t.id および TheIds.rownum <1000 の TheIds から 1 を選択)
プレ>
ここでの exists 句は、左外部結合
と同等の処理を行っています。 .主な違いは、この相関サブクエリ構文は、更新を伴う結合がデータベース固有である他のデータベースでも機能することです。
rownum
で 列で、更新に必要な数の行を選択できます。したがって、更新全体が大きすぎる場合は、更新をループに入れることができます。
where rownum <100000where rownum between 100000 and 199999where rownum between 200000 and 299999
プレ>
等々。これを行う必要はありませんが、何らかの理由で更新をバッチ処理したい場合は行うことができます。
重要なアイデアは、ID のリストをデータベース内のテーブルに取得することです。これにより、データベースの機能を後続の操作に使用できます。