Pertama-tama apakah ini permintaan satu kali atau permintaan berulang? Jika Anda hanya perlu melakukannya sekali, Anda mungkin ingin menjalankan kueri dalam mode paralel. Anda tetap harus memindai semua baris, Anda dapat membagi beban kerja sendiri dengan rentang ROWID (paralelisme do-it-yourself) atau menggunakan fitur bawaan Oracle.
Dengan asumsi Anda ingin sering menjalankannya dan ingin mengoptimalkan kueri ini, jumlah baris dengan field
kolom sebagai NULL pada akhirnya akan menjadi kecil dibandingkan dengan jumlah total baris. Dalam hal ini indeks dapat mempercepat. Oracle tidak mengindeks baris yang memiliki semua kolom yang diindeks sebagai NULL sehingga indeks pada field
tidak akan digunakan oleh kueri Anda (karena Anda ingin menemukan semua baris di mana field
adalah NULL).
Atau:
- buat indeks pada
(FIELD, 0)
,0
akan bertindak sebagai pseudocolumn non-NULL dan semua baris akan diindeks pada tabel. -
buat indeks berbasis fungsi pada
(CASE WHEN field IS NULL THEN 1 END)
, ini hanya akan mengindeks baris yang NULL (karena itu indeks akan sangat kompak). Dalam hal ini Anda harus menulis ulang kueri Anda:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Sunting:
Karena ini adalah skenario satu kali, Anda mungkin ingin menggunakan PARALLEL
petunjuk:
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:
--------------------------------------------------------------------------------