|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |||
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Bonjour,
Voilà, j'ai une table de codification qui a changé et je dois faire une moulinette permettant de remplacer l'ancienne valeur du champ en question par la nouvelle. Un petit exemple : Citation:
Jusque la, pas de problème sauf que : Je vais tomber sur des tables qui contiennent énormément d'enregistrements (+ de 50 millions) et je compte mettre à jour la table comme ceci (Information importante : Pas de PK ni d'index sur la colonne Codif) : Code :
- de remonter une exception car nombre de lignes est trop important - de mettre énormément de temps !!!! Que me conseillez-vous ? Quels sont vos conseils ? |
|||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Il faut que votre table de correspondance soit indexée sur l'ancien code car ce sera la clef d'entrée de l'update.
Sur votre grosse table, je ferait une boucle pour faire des updates par gros packet (de 1 million par exemple) en jouant sur des encadrement de valeur de la clef primaire. Aussi, je ferais les choses en 2 temps: 1- Génération automatique du code SQL d'update 2- Exécution de ce code en sortant à la première erreur. Ainsi vous pourrez contrôler votre processus. Évidement, avant de faire cette opération délicate, il est indispensable de faire une sauvegarde de la base, ou tout du moins, de chaque table updatée. |
|
|
00
|
|
|
#3 | |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Citation:
Sinon le champ est bien indexé (index non unique) mais cet index est créé avec plusieurs autre champ. J'ai regardé le plan d'exécution de l'update, il prend bien en compte l'index. J'ai effectué un test, mise à jour de 400 000 lignes (je crois) sur 24 millions et la mise à jour prend environ 19/20minutes sur une BASE DE TEST, de plus, je ne sais pas si les stats sont à jour... Ça fait quand même beaucoup de temps, surtout que c'est pour 1 seul valeur la. La table de codif fait 360 enregistrements !!!! et je n'ai pas que cette "opération à faire". J’essaie de vous donner des imprimes écran demain matin sur la table, les index, le plan d’exécution... |
|
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Citation:
|
|
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Voila quelques infos sur la table :
Il est vrai que la mise à jour va être plus rapide si j'ajoute un filtre sur le CodeSaison par exemple mais je vais devoir faire pas mal d'update si je veux balayer toute la table. Au final, est-ce plus rapide, je ne sais pas....?! |
|
|
00
|
|
|
#6 |
![]() ![]() |
Et là, les lacunes de conceptions remontent...
On choisi en clef primaire des données qui sont immuables, en cas de doutes on utilise on en créé une avec une séquence. Donc vous allez faire votre mise à jour, et demain rebelote, vos codifications rechangent. Vous recommencez ? Vous avez besoin d'une modification importante pour vous débarrasser de ce carcan. Au niveau des opérations légères au niveau de la BDD, mais qui impliquent une modification de l'amont, vous pouvez :
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
j'ai l'impression que vos update se font par une grande boucle et non de manière ensembliste...
Dans tous les cas, c'est clair que ces index très larges ne favorisent pas les performances car l'update entraîne une grosse réorganisation de ces derniers. |
|
|
00
|
|
|
#8 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Concernant Waldar,
Ces codifications ne doivent normalement pas changé. Ici c'est un cas exceptionnel. J'utiliserai bien la table de correspondance lié à cette table. Le problème c'est qu'il n'est pas possible de modifier le programme. Cela engendrait trop de modification... Bref, quelle optimisation puis-je faire dans la moulinette ? |
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Et en créant des vues ?
|
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Non ça serait pareil.
Je ne fais pas que des select sur cette table. Je fais aussi des update, insert, delete donc il a une gestion supplémentaire à mettre en place si je fais ça. Je vais faire des tests chronométré : - en faisant une restriction sur CodeClassProd3 - en faisant une restriction sur CodeTypePeriode et CodeClassProd3 (CodeTypePeriode : 3 valeurs possible) - en faisant un Insert en masse puis un delete en masse |
|
|
00
|
|
|
#11 |
![]() ![]() |
cqfd.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Dans la mise à jour des grandes tables il est souvent plus performant :
à la place de l’update. |
|
|
00
|
|
|
#13 | |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Citation:
- Sinon en créant un index uniquement sur CodeClassProd3 et mettre à jour les stats pour faire mon update, ça n'arrangerait rien ? - Et en supprimant les index pour les réactiver après l'update ? |
|
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() ACInscription : octobre 2010 Messages : 28 ![]() |
Peut-être une piste :
a) create d'une nouvelle table avec le résultat escompté (table de base avec colonne mise à jour). => create table as select .... b) truncate de la table de base c) désactivation des index de la table de base d) insert depuis la nouvelle table dans la table de base e) rebuild des index |
|
|
00
|
|
|
#15 | |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Citation:
|
|
|
|
00
|
|
|
#16 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
La méthode update met 19min
La méthode - Create Table ... As Select ... - Create Index ... - Rename AncienneTable - Renanme NouvelleTable met 46s. Il n'y a pas photo, je pars sur cette solution. Sinon pensez-vous que je peux effectuer cette méthode même sur des petites tables ? ou vaut mieux faire un update sur les petites tables et un create table sur les grosses tables ? Dois-je m'embêter à faire un traitement spécifique selon la volumétrie des tables ? |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Avec la solution de pepito62, vu qu'il faut reproduire sur la nouvelle table tout ce qu'il y avait sur l'ancienne (index, contraintes, triggers, commentaires, etc.) je dirais que soit vous faites un programme complet et vous le passez pour toutes les tables, soit effectivement vous prenez en compte la volumétrie.
C'est un problème qui ne se pose pas avec la solution de wahnfried.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 307 ![]() |
Oui. Pour les petites/moyens tables faire un simple update c'est mieux.
|
|
|
00
|
|
|
#19 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Ok merci, je partais sur cette solution.
Pour les petites et moyennes tables, je fais un update Pour les grosses tables, un create table as select - Sinon petites et moyennes tables, c'est combien de lignes environ ? (pour mon traitement) |
|
|
00
|
|
|
#20 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 274 ![]() |
Au dessus de 400 000 lignes, faire un "create table as select" semble correct ?
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com