まず第一に、それは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:
--------------------------------------------------------------------------------