sql >> Base de Datos >  >> RDS >> Oracle

Cómo optimizar un SQL de actualización que se ejecuta en una tabla de Oracle con 700 millones de filas

En primer lugar, ¿es una consulta única o es una consulta recurrente? Si solo tiene que hacerlo una vez, puede considerar ejecutar la consulta en modo paralelo. Tendrá que escanear todas las filas de todos modos, puede dividir la carga de trabajo usted mismo con rangos de ROWID (paralelismo de bricolaje) o usar las funciones integradas de Oracle.

Suponiendo que desea ejecutarlo con frecuencia y desea optimizar esta consulta, la cantidad de filas con el field columna como NULL finalmente será pequeña en comparación con el número total de filas. En ese caso, un índice podría acelerar las cosas. Oracle no indexa las filas que tienen todas las columnas indexadas como NULL, por lo que un índice en field no será utilizado por su consulta (ya que desea encontrar todas las filas donde field es NULO).

O bien:

  • crear un índice en (FIELD, 0) , el 0 actuará como una pseudocolumna no NULL y todas las filas se indexarán en la tabla.
  • cree un índice basado en funciones en (CASE WHEN field IS NULL THEN 1 END) , esto solo indexará las filas que son NULL (por lo tanto, el índice sería muy compacto). En ese caso, tendría que volver a escribir su consulta:

    UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

Editar:

Dado que este es un escenario de una sola vez, es posible que desee utilizar el PARALLEL pista:

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:
--------------------------------------------------------------------------------