Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment optimiser une mise à jour SQL qui s'exécute sur une table Oracle avec 700 millions de lignes

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