J'ai un entrepôt de données (oracle) où je dois définir une colonne à la même valeur pour les 700 millions de lignes.
Je n'ai pas d'accès administrateur, ni accès à un administrateur, donc cela doit être accompli avec sql de base et aucune table temporaire ne crée.
Pour compliquer encore les choses, si j'essaie de faire une simple mise à jour où 1 = 1, il manque d'espace de rétablissement.
La façon dont je le fais fonctionner en ce moment est en boucle comme ceci:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
mais je sais que c'est probablement naïf et il doit y avoir une solution plus rapide et plus élégante.
oracle
performance
owook
la source
la source
Réponses:
Si vous avez l'espace, vous pouvez utiliser CTAS en utilisant un minimum d'annulation / de rétablissement . Si vous avez des index, le faire d'une autre manière sera très lent et générera une journalisation comme un fou.
Dans le cas où vous avez un seul IOT sans index secondaire, ou un cluster de table unique, vous pouvez parcourir la mise à jour de la clé primaire / cluster en morceaux sans avoir à analyser à nouveau la table entière pour trouver les champs qui n'ont pas encore été mis à jour.
--Éditer
Ensuite, je suggère de diviser le tableau en morceaux pour le traitement en utilisant quelque chose sur lequel vous indexez (même s'il s'agit d'une seule colonne, vous pouvez le diviser en plages de valeurs) Cela fera un FTS une fois au lieu d'une fois pour chaque morceau comme dans votre code. Vous devrez vivre avec beaucoup de refaire et effacer votre espace d'annulation aussi (donc pas de flashback par la suite)
--edit2
si vous pouvez ajouter / renommer / supprimer des colonnes, vous pouvez le faire très efficacement , mais uniquement sur 11g
la source
NOLOGGING
, cela invalidera les hotstandbys.nologging
un outil pour les entrepôtscreate table foo as select * from bar where rownum<100000
)Si vous êtes sur 11g, déposez la colonne et ajoutez-la en tant que colonne NOT NULL avec une valeur par défaut. C'est contre-intuitif, mais Oracle stockera la valeur par défaut dans la définition de la table, en la remplaçant au moment de l'exécution.
la source