Je veux connaître la manière la plus efficace de mettre à jour chaque ligne d'une table Oracle extrêmement grande pour une seule colonne. Par exemple:
update mytable set mycolumn=null;
ou:
update mytable set mycolumn=42;
Ma connaissance peut très bien être périmée. Ce que je fais, c'est modifier le tableau pour supprimer la colonne. Ensuite, je modifie le tableau pour ajouter la colonne avec une valeur par défaut de la nouvelle valeur que je veux utiliser. Ensuite, je modifie le tableau pour supprimer la valeur par défaut de la colonne. Je trouve que c'est beaucoup plus rapide que de simplement exécuter une mise à jour, mais j'ai le sentiment qu'il existe une meilleure méthode.
Réponses:
Cela dépend beaucoup de l'autre activité en cours contre ce tableau pendant que vous effectuez cette mise à jour en masse. J'espère que vous avez une sorte d'environnement de test où vous pouvez exécuter des échantillons de ce que vous aimeriez faire et avoir une idée de la meilleure façon. Je voudrais essayer:
update table set column_name = blah
;updating the column=blah
et validez toutes les mises à jour X (peut-être 10000). Vous pouvez paralléliser ce code en le copiant et en le faisant copier dans une section distincte des clés primaires.Nous avons eu un problème très similaire avec une table qui était très activement utilisée dans le système OLTP et nous avons pu la paralléliser 5 fois et fonctionner sans impact de verrouillage utilisateur sur une table de lignes de 100+ MM validée tous les 10000. Vous n'avez pas dit comment votre table est grande ou quel type d'application vous exécutez, mais ce type de solution peut vous convenir.
la source
Pour un jeûne
UPDATE
, assurez-vous que vous n'avez aucun déclencheur qui se déclenche.Assurez-vous de ne réactiver que ceux que vous souhaitez lorsque vous avez terminé.
Vous pourriez également être confronté à la surcharge de la maintenance d'index. Essayez de reconstruire vos index séparément. Pour ce faire, la réponse ici par pappes devrait être utile: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Je répète la réponse de Pappes ici pour référence. (Notez que cette commande SPOOL émet des hypothèses sur votre plate-forme et votre environnement.)
Importez ...
la source
supprimer l'index. mettre à jour la colonne. renvoyer l'index. mais si la colonne contient une seule et même valeur pour toutes les lignes, vous pouvez supprimer l'index.
la source
Si vous n'avez pas de limitation d'espace, vous pouvez créer une nouvelle table, la même que votre table avec votre nouvelle colonne ajoutée à cette table et supprimer l'ancienne table:
la source
Essayez plusieurs séquences de mise à jour / validation. L'insertion / la mise à jour / la suppression d'un trop grand nombre de lignes sans validation entraîne une lourde charge d'E / S. Il peut être assez optimisé en connaissant les tailles de bloc et les tailles d'enregistrement et d'autres choses.
Pour supprimer des données entières sur une table,
truncate table x
c'est mieux quedelete from x
. La purge crée également une autre charge de travail de processus.Modifier: Vous pouvez utiliser l'
inmemory
option, charger la table en mémoire au format en colonnes, puis faire la mise à jour. cela dépend vraiment des relations et de la structure de votre base de données. Consultez cet article .la source
truncate
oudelete
serait d'aucune aide.