ASE : 12.5
Bonjour,
Je souhaite copier 60 Millions d'enregistrements d'une table vers une autre.
Etant restreint en segment de log, l'INSERT INTO n'est pas envisageable, le BCP OUT/IN également.
Auriez-vous une solution ?
D'avance merci
ASE : 12.5
Bonjour,
Je souhaite copier 60 Millions d'enregistrements d'une table vers une autre.
Etant restreint en segment de log, l'INSERT INTO n'est pas envisageable, le BCP OUT/IN également.
Auriez-vous une solution ?
D'avance merci
tu peux utiliser la commande SELECT cols INTO new_table FROM table_origine,
ton journal ne sera pas rempli mais ta cohérence transactionnelle est perdue donc il faudra faire un backup complet ensuite.
Pour limiter la taille de la log on peut faire un SELECT ... INTO ... FROM ...
Cela implique que l'option "select into" est positionnée pour la base, et il faudra faire un DUMP DATABASE complet après l'insert pour que les saves de la transaction log soient utilisablent.
Autremement il faut découper le select en blocs, en utilisant SET ROWCOUNT pour limiter le nombres d'inserts fait par itérations, et en faisant un DUMP TRAN entre chaque itération. Evidemment il faut que le select puisse rapidement trouver où il doit commencer pour chaque itération.
On pourrait imaginer qqch comme ceci (dans l'example ci-dessous on admet que la colonne "id" est un numeric et est la pk):
Il faut avoir un index sur "id" sur la nouvelle table pour que cela marche avec une vitesse raisonnable!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 declare @startId numeric declare @rows int set rowcount 10000 select @rows = 10000 while @rows > 0 begin select @startId = isnull(max(id), 0) from nouvelle_table insert nouvelle_table select * from ancienne_table where id > @startId select @rows = @@rowcount dump transaction ma_db to "/chemin....." end
Reste à voir si ce genre de solution est adaptable à ta situation.
Michael
Je suis pour la méthode select into from... mais juste pour curiosité, pourquoi pas de bcp out/in en mode fast ?
Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2
N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD
Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
Il est peut-être envisageable d'utiliser l'option -b <nombre de ligne> du bcp pour commiter tous les n lignes.
Le seul soucis avec le select into c'est qu'il ne fonctionne que si la table destination n'existe pas (le select into existing table ne fonctionne que vers des tables proxy).
Si la table destination existe et qu'on veut conserver son contenu, il faut faire quelque chose dans ce genre (non testé)
Et hop, une nouvelle table qui contient toutes les lignes souhaitées. Il n'y a plus qu'a remplacer la table destination avec un drop/sp_rename.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select * into table3 from table2 union all select * from table1
Pour le bcp out pas de problèmes de segments, par contre le bcp in peut en avoir si tu as des PK, indexs .....
Pour les GROS bcp in j'ai un truc pour laisser le serveur "souffler" : l'option -b
bcp mabase..matable in monfichier.bcp -Uuser -Ppassword -Sserver -b5000
Ca va faire des "tranches" de 5000 enregistrements et faire une pause enter chaque.
Je fais souvent des bcp in de plus de 20 millions de lignes avec cette méthode.
Partager