Comment optimiser une mise à jour SQL qui s'exécute sur une table Oracle avec 700M lignes
UPDATE [TABLE] SET [FIELD]=0 WHERE [FIELD] IS NULL
[TABLE] est une base de données Oracle table avec plus de 700 millions de lignes. J'ai annulé l'exécution de SQL après qu'il avait été en cours d'exécution pendant 6 heures.
Est-il une astuce SQL qui pourrait améliorer les performances? Ou toute autre solution à la vitesse?
EDIT: Cette requête sera exécutée une fois et plus jamais ensuite.
source d'informationauteur b.roth
Vous devez vous connecter pour publier un commentaire.
Tout d'abord est-il un moment de la requête ou est-il récurrent de la requête ? Si vous avez seulement à faire une fois, vous voudrez peut-être chercher dans l'exécution de la requête en mode parallèle. Vous aurez à analyser toutes les lignes de toute façon, vous pourriez diviser la charge de travail vous-même avec des plages de ROWID (do-it-yourself de parallélisme) ou de l'utilisation d'Oracle fonctionnalités.
En supposant que vous souhaitez exécuter fréquemment et vous voulez optimiser cette requête, le nombre de lignes avec la
field
colonne NULLE finira par être petit par rapport au nombre total de lignes. Dans ce cas, un indice pourrait accélérer les choses. Oracle n'a pas d'index des lignes qui ont toutes les colonnes indexées comme NULL si un index surfield
ne pas s'en servir par votre requête (puisque vous voulez trouver toutes les lignes oùfield
est NULL).:
(FIELD, 0)
le0
va agir comme un non-NULLE de la pseudo-colonne et toutes les lignes seront indexés sur la table.créer une fonction d'index de base sur
(CASE WHEN field IS NULL THEN 1 END)
ce sera seul indice pour les lignes qui sont les valeurs Null (l'indice serait donc très compact). Dans ce cas, il faudrait réécrire votre requête:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Edit:
Puisque c'est un scénario, vous pouvez utiliser le
PARALLEL
astuce:Autres utilisateurs mettent à jour les mêmes lignes dans la table en même temps ?
Si oui, vous pourriez être frappé beaucoup de problèmes de simultanéité (en attente de serrures) et il peut être intéressant de le découper en plus petites transactions.
Le plus petit de la ROWNUM limiter le moins de simultanéité/problèmes de verrouillage vous serez frappé, mais plus le temps que vous passerez dans le tableau de numérisation.
Vincent déjà répondu à votre question parfaitement, mais je suis curieux de savoir le "pourquoi" derrière cette action. Pourquoi êtes-vous à jour de toutes les NULS est à 0?
Ce qui concerne,
Rob.
Quelques suggestions:
Déposez tous les indices qui contiennent le TERRAIN avant de lancer votre instruction de mise à JOUR, puis les rajouter plus tard.
Écrire un PL/SQL procédure à suivre ce qui les engage après chaque 1000 ou 10000 lignes.
Espère que cette aide.
Vous pourriez obtenir le même résultat sans mise à jour à l'aide d'une instruction ALTER table pour définir les colonnes "valeur par DÉFAUT à 0.