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

7億行のOracleテーブルで実行される更新SQLを最適化する方法

    まず第一に、それは1回限りのクエリですか、それとも繰り返しのクエリですか?一度だけ実行する必要がある場合は、並列モードでのクエリの実行を検討することをお勧めします。とにかくすべての行をスキャンする必要があります。ROWID(日曜大工の並列処理)の範囲でワークロードを自分で分割するか、Oracleの組み込み機能を使用することができます。

    頻繁に実行し、このクエリを最適化する場合、fieldの行数 NULLとしての列は、最終的には行の総数と比較して小さくなります。その場合、インデックスは物事をスピードアップする可能性があります。 Oracleは、すべてのインデックス付き列を持つ行をNULLとしてインデックス付けしないため、fieldのインデックスを作成します。 クエリでは使用されません(fieldがあるすべての行を検索する必要があるため) NULLです)。

    どちらか:

    • (FIELD, 0)にインデックスを作成します 、0 NULL以外の疑似列として機能し、すべての行がテーブルにインデックス付けされます。
    • (CASE WHEN field IS NULL THEN 1 END)に関数ベースのインデックスを作成します 、これはNULLである行にのみインデックスを付けます(したがって、インデックスは非常にコンパクトになります)。その場合、クエリを書き直す必要があります:

      UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

    編集:

    これは1回限りのシナリオであるため、PARALLELを使用することをお勧めします。 ヒント:

    SQL> EXPLAIN PLAN FOR
      2  UPDATE /*+ PARALLEL(test_table 4)*/ test_table
      3     SET field=0
      4   WHERE field IS NULL;
    
    Explained
    
    SQL> select * from table( dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 4026746538
    --------------------------------------------------------------------------------
    | Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time
    --------------------------------------------------------------------------------
    |   0 | UPDATE STATEMENT      |            | 22793 |   289K|    12   (9)| 00:00:
    |   1 |  UPDATE               | TEST_TABLE |       |       |            |
    |   2 |   PX COORDINATOR      |            |       |       |            |
    |   3 |    PX SEND QC (RANDOM)| :TQ10000   | 22793 |   289K|    12   (9)| 00:00:
    |   4 |     PX BLOCK ITERATOR |            | 22793 |   289K|    12   (9)| 00:00:
    |*  5 |      TABLE ACCESS FULL| TEST_TABLE | 22793 |   289K|    12   (9)| 00:00:
    --------------------------------------------------------------------------------
    


    1. Postgres9.4でJSONBタイプの列に対して更新操作を実行する方法

    2. 孤立したレコードのPostgres削除を最適化する

    3. xml切り捨て値からのOracle抽出

    4. Rails Activerecord/Postgresの時間形式