Oracle
 sql >> Database >  >> RDS >> Oracle

Come ottimizzare un aggiornamento SQL eseguito su una tabella Oracle con 700 milioni di righe

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) , il 0 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:
--------------------------------------------------------------------------------