För det första är det en engångsfråga eller är det en återkommande fråga? Om du bara behöver göra det en gång kanske du vill titta på att köra frågan i parallellt läge. Du måste skanna alla rader ändå, du kan antingen dela upp arbetsbelastningen själv med ROWID-intervall (gör-det-själv-parallellism) eller använda Oracles inbyggda funktioner.
Förutsatt att du vill köra den ofta och vill optimera den här frågan, antalet rader med field
kolumnen som NULL kommer så småningom att bli liten jämfört med det totala antalet rader. I så fall kan ett index påskynda saker och ting. Oracle indexerar inte rader som har alla indexerade kolumner som NULL så ett index på field
kommer inte att användas av din fråga (eftersom du vill hitta alla rader där field
är NULL).
Antingen:
- skapa ett index på
(FIELD, 0)
,0
kommer att fungera som en icke-NULL-pseudokolumn och alla rader kommer att indexeras i tabellen. -
skapa ett funktionsbaserat index på
(CASE WHEN field IS NULL THEN 1 END)
, kommer detta bara att indexera de rader som är NULL (indexet skulle därför vara mycket kompakt). I så fall måste du skriva om din fråga:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Redigera:
Eftersom detta är ett engångsscenario kanske du vill använda PARALLEL
tips:
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:
--------------------------------------------------------------------------------