IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Adaptive Server Enterprise Sybase Discussion :

[ASE12.5]Insertion en masse dans une table


Sujet :

Adaptive Server Enterprise Sybase

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    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

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    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.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    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 : 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
    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

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    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 !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut
    Il est peut-être envisageable d'utiliser l'option -b <nombre de ligne> du bcp pour commiter tous les n lignes.

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Par défaut
    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 : 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
    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.

  7. #7
    Membre averti
    Profil pro
    Data Engineer
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Data Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    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.

Discussions similaires

  1. Insert en masse dans une table avec Hibernate
    Par goomie dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/05/2011, 23h47
  2. Insertion en masse dans une table
    Par scheu dans le forum Administration
    Réponses: 5
    Dernier message: 04/10/2007, 17h33
  3. Réponses: 3
    Dernier message: 23/11/2006, 16h45
  4. [A97] VBA : Commande sql pour insertion de champs dans une table
    Par JeremieT dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/07/2006, 13h12
  5. echec d'insertion de ligne dans une table
    Par foblar dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/07/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo