sql >> データベース >  >> RDS >> Sqlserver

レコード ID のリストを入力として使用して、SQL サーバーで 400 万件のレコードを更新する

    この質問にアプローチする最善の方法は、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 のリストをデータベース内のテーブルに取得することです。これにより、データベースの機能を後続の操作に使用できます。



    1. yiiの配列にSQLクエリを配置する方法

    2. 文字列データ、右切り捨て:1406データが列に対して長すぎます

    3. 多くの列を1つにマージし、類似性を維持し、相違点を置き換えます

    4. ZendFrameworkでプリペアドステートメントを使用する方法