1. #1
    Membre régulier
    Inscrit en
    février 2004
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 296
    Points : 108
    Points
    108

    Par défaut INSERT FROM SELECT (performance)

    Bonjour à tous,

    J'ai plusieurs tables formatées de la même manière contenant chacune d'entre elles plusieurs millions de lignes ([crb1] [crb2] [crb3], etc).
    Je dois créer une table dite "agrégée" contenant un ensemble de [crb1] [crb2] [crb3] pouvant contenir plusieurs centaines de milliers de lignes.
    J'ai donc écrit une procédure stockée qui permet de faire un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ... SELECT FROM [crb1] WHERE [conditions]
    !!

    Le problème c'est que ça prend un temps fou... J'ai un réel problème de performance !!
    Avez vous une autre solution à me proposer ??

  2. #2
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 115
    Points : 6 859
    Points
    6 859
    Billets dans le blog
    1

    Par défaut

    Bonjour

    Si le but est de recharger la totalité des différentes tables dans une seule, et que vos volumes sont significatifs, il est nettement préférable de passer par un load et non par insert :
    - votre chargement sera extrèmement rapide
    - vous ne chargerez pas la log inutilement
    - vous pourrez profiter de l'opération pour mettre à jour vos statistiques
    Si en plus votre table cible est partitionnée, vous pourrez paralléliser le chargement de chacune des partitions

    Sur une table de plusieurs millions ou milliards de lignes, vous allez passer de plusieurs heures (voir jours ), à quelques minutes pour tout charger

  3. #3
    Membre régulier
    Inscrit en
    février 2004
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 296
    Points : 108
    Points
    108

    Par défaut

    C'est quoi le principe du LOAD je ne connais pas !! Plus d'explications s'il vous plait si possible

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 115
    Points : 6 859
    Points
    6 859
    Billets dans le blog
    1

  5. #5
    Membre régulier
    Inscrit en
    février 2004
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 296
    Points : 108
    Points
    108

    Par défaut

    OK...
    Je dois faire un bulk sur une query spécifique qui sera lancée sur chaque table. En fait je ne fais pas une copie totale de la table mais seulement une partie !!
    Et je dois faire un import avec bulk INSERT dans la table 'agrégée'.

    Est ce que bulk peut me faire cela tu penses ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    décembre 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : décembre 2007
    Messages : 291
    Points : 589
    Points
    589

    Par défaut

    Bonjour,

    Sinon vous pouvez passer par SSIS ...
    MCSA SQL SERVER |MCT | MVP Data Platform

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 644
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 644
    Points : 9 405
    Points
    9 405

    Par défaut

    Bonjour,

    Le mieux serait de prendre le mal à la racine : pourquoi avez vous plusieurs tables de même structures, et pourquoi les agréger dans une autre tables.

    C'est sans doute dû à un problème de modélisation, qu'il faudrait corriger.

    expliquez un peu plus le contexte, on pourra peut être vous aiguiller sur des solutions plus saines.

    Par exemple des vues, éventuellement indexées.

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    août 2005
    Messages
    5 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : août 2005
    Messages : 5 021
    Points : 11 643
    Points
    11 643

    Par défaut

    Citation Envoyé par julien94320 Voir le message
    Bonjour,

    Sinon vous pouvez passer par SSIS ...
    Effectivement passer par un package SSIS avec chargements des tables sources en parallèle en mode bulk dans la table destinatrice pourrait apporter un certain avantage ici.
    Il faut bien entendu répondre à certains prérequis (utilisation d'un mode de récupération adéquate, verrouillage au niveau table pour la table destinatrice etc ... cf Microsoft technet)

    ++

  9. #9
    Membre régulier
    Inscrit en
    février 2004
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 296
    Points : 108
    Points
    108

    Par défaut

    Le contexte est simple.
    Mes tables contiennent des datas mais avec plusieurs versions (v1 ... vn).
    L'idée est donc de pouvoir générée une table agrégée à la demande avec le max version de chaque table "splittée".
    Historiquement il y a sans doute un problème de conception, mais la je dois faire avec !!

  10. #10
    Modérateur
    Avatar de elsuket
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    janvier 2005
    Messages
    5 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2005
    Messages : 5 810
    Points : 11 937
    Points
    11 937

    Par défaut

    Bonjour,

    On ne sait pas encore où le moteur passe le plus clair de son temps à exécuter la requête.
    C'est peut-être tout simplement un problème d'indexation : il est possible que la recherche des lignes correspondant à la bonne version dans chaque table soit problématique.

    Pourriez-vous récupérer le plan estimé du SELECT de l'INSERT svp ?
    Pour ce faire, surlignez le SELECT de l'INSERT, et pressez CTRL+L : le plan d'exécution de la requête va s'afficher dans un onglet du panneau de Résultats de la requête.
    En faisant un clic-droit sur une zone vierge du plan, sélectionnez Save Execution Plan As ... et procédez comme d'habitude pour sauvegarder un fichier.
    Vous pouvez ensuite attacher ce fichier à votre réponse ici.

    @++

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2012, 12h32
  2. Requête insert from select
    Par Sfaxiano dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/12/2011, 17h43
  3. [AC-2003] souci utilisation de INSERT INTO- SELECT- FROM- WHERE
    Par eugene_françois dans le forum Modélisation
    Réponses: 1
    Dernier message: 16/04/2010, 17h14
  4. insert into from select ?
    Par axel584 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 25/01/2005, 19h10
  5. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 15h39

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