Først og fremmest er det en engangsforespørgsel eller er det en tilbagevendende forespørgsel? Hvis du kun skal gøre det én gang, vil du måske overveje at køre forespørgslen i parallel tilstand. Du bliver alligevel nødt til at scanne alle rækker, du kan enten selv opdele arbejdsbyrden med rækker af ROWID (gør-det-selv parallelitet) eller bruge Oracles indbyggede funktioner.
Forudsat at du vil køre det ofte og ønsker at optimere denne forespørgsel, er antallet af rækker med field
kolonne som NULL vil i sidste ende være lille sammenlignet med det samlede antal rækker. I så fald kunne et indeks fremskynde tingene. Oracle indekserer ikke rækker, der har alle indekserede kolonner som NULL, så et indeks på field
vil ikke blive brugt af din forespørgsel (da du vil finde alle rækker, hvor field
er NULL).
Enten:
- opret et indeks på
(FIELD, 0)
,0
vil fungere som en ikke-NULL pseudokolonne, og alle rækker vil blive indekseret i tabellen. -
opret et funktionsbaseret indeks på
(CASE WHEN field IS NULL THEN 1 END)
, vil dette kun indeksere de rækker, der er NULL'er (indekset ville derfor være meget kompakt). I så fald skal du omskrive din forespørgsel:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Rediger:
Da dette er et engangsscenarie, vil du måske bruge PARALLEL
tip:
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:
--------------------------------------------------------------------------------