Is het in de eerste plaats een eenmalige vraag of is het een terugkerende vraag? Als u het maar één keer hoeft te doen, kunt u overwegen de query in parallelle modus uit te voeren. U zult toch alle rijen moeten scannen, u kunt de werklast zelf verdelen met ROWID-reeksen (doe-het-zelf-parallellisme) of de ingebouwde functies van Oracle gebruiken.
Ervan uitgaande dat u het regelmatig wilt uitvoeren en deze zoekopdracht wilt optimaliseren, is het aantal rijen met het field
kolom als NULL uiteindelijk klein zal zijn in vergelijking met het totale aantal rijen. In dat geval zou een index de zaken kunnen versnellen. Oracle indexeert geen rijen die alle geïndexeerde kolommen als NULL hebben, dus een index op field
wordt niet gebruikt door uw zoekopdracht (omdat u alle rijen wilt vinden waar field
is NULL).
Ofwel:
- maak een index op
(FIELD, 0)
, de0
zal fungeren als een niet-NULL-pseudokolom en alle rijen worden op de tabel geïndexeerd. -
maak een functie-gebaseerde index op
(CASE WHEN field IS NULL THEN 1 END)
, dit zal alleen de rijen indexeren die NULL's zijn (de index zou daarom erg compact zijn). In dat geval zou u uw vraag moeten herschrijven:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Bewerken:
Aangezien dit een eenmalig scenario is, wilt u misschien de PARALLEL
. gebruiken hint:
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:
--------------------------------------------------------------------------------