Prima di tutto è una query occasionale o è una query ricorrente? Se devi farlo solo una volta, potresti voler esaminare l'esecuzione della query in modalità parallela. Dovrai comunque scansionare tutte le righe, puoi dividere tu stesso il carico di lavoro con intervalli di ROWID (parallalismo fai-da-te) o utilizzare le funzionalità integrate di Oracle.
Supponendo che tu voglia eseguirlo frequentemente e desideri ottimizzare questa query, il numero di righe con il field
colonna come NULL alla fine sarà piccola rispetto al numero totale di righe. In tal caso un indice potrebbe velocizzare le cose. Oracle non indicizza le righe che hanno tutte le colonne indicizzate come NULL, quindi un indice su field
non verrà utilizzato dalla tua query (dal momento che desideri trovare tutte le righe in cui field
è NULL).
O:
- crea un indice su
(FIELD, 0)
, il0
agirà come una pseudocolonna non NULL e tutte le righe verranno indicizzate sulla tabella. -
crea un indice basato su funzione su
(CASE WHEN field IS NULL THEN 1 END)
, questo indicizzerà solo le righe che sono NULL (l'indice sarebbe quindi molto compatto). In tal caso dovresti riscrivere la tua richiesta:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Modifica:
Poiché si tratta di uno scenario occasionale, potresti voler utilizzare il PARALLEL
suggerimento:
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:
--------------------------------------------------------------------------------