Précédent   Forum des professionnels en informatique > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/07/2007, 14h45   #1
Invité de passage
 
Inscription : février 2007
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 23
Points : 1
Points : 1
Par défaut [ASE12.5]Insertion en masse dans une table

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
jfmerveille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 15h10   #2
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
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.
__________________
Emmanuel T.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 15h13   #3
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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):
Code :
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
Il faut avoir un index sur "id" sur la nouvelle table pour que cela marche avec une vitesse raisonnable!

Reste à voir si ce genre de solution est adaptable à ta situation.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 16h43   #4
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 779
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Service public

Informations forums :
Inscription : octobre 2002
Messages : 3 779
Points : 8 124
Points : 8 124
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
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 / Sybase / MS-SQL / DB2 / Informix / Postgresql
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 17h53   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 10
Points : 10
Points : 10
Il est peut-être envisageable d'utiliser l'option -b <nombre de ligne> du bcp pour commiter tous les n lignes.
Gauthde est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2007, 23h50   #6
Membre actif
 
Inscription : août 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 134
Points : 152
Points : 152
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é)

Code :
1
2
3
4
5
6
 
SELECT *
INTO table3
FROM table2
union ALL
SELECT * FROM table1
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.
Roller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 15h14   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 15
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 15
Points : 13
Points : 13
Par défaut tous les secrets du bcp in

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.
Romane est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h17.


 
 
 
 
Partenaires

Hébergement Web