Tout d'abord est-ce une requête ponctuelle ou est-ce une requête récurrente ? Si vous ne devez le faire qu'une seule fois, vous pouvez envisager d'exécuter la requête en mode parallèle. Vous devrez de toute façon analyser toutes les lignes, vous pouvez soit diviser la charge de travail vous-même avec des plages de ROWID (parallélisme à faire soi-même) ou utiliser les fonctionnalités intégrées d'Oracle.
En supposant que vous souhaitiez l'exécuter fréquemment et optimiser cette requête, le nombre de lignes avec le field
colonne comme NULL sera finalement petit par rapport au nombre total de lignes. Dans ce cas, un index pourrait accélérer les choses. Oracle n'indexe pas les lignes qui ont toutes les colonnes indexées comme NULL donc un index sur field
ne sera pas utilisé par votre requête (puisque vous voulez trouver toutes les lignes où field
est NULL).
Soit :
- créer un index sur
(FIELD, 0)
, le0
agira comme une pseudo-colonne non NULL et toutes les lignes seront indexées sur la table. -
créer un index basé sur la fonction sur
(CASE WHEN field IS NULL THEN 1 END)
, cela n'indexera que les lignes qui sont NULL (l'index serait donc très compact). Dans ce cas, vous devrez réécrire votre requête :UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Modifier :
Puisqu'il s'agit d'un scénario unique, vous pouvez utiliser le PARALLEL
indice :
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:
--------------------------------------------------------------------------------