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)
, el0
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:
--------------------------------------------------------------------------------