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

Développement SQL Server Discussion :

Optimisation d'un traitement SQL


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut Optimisation d'un traitement SQL
    Bonjour à tous,

    Je travaille sur l'intégration d'un fichier EDI et je souhaiterai optimiser le traitement auquel j'ai abouti et qui ne me donc pas satisfaction en terme de temps d'exécution.
    Je travaille sur SQL Server 2008 R2 hébergé sur un serveur Azure et donc avec des performance assez moyenne.

    Le fichier d'entrée est un fichier texte qui présente des informations sur un colis. Sur la ligne 1 nous allons trouver l'identifiant du colis, sur la ligne 2 un code d'événement, sur la ligne 3 la date de l'événement et se schéma se répète : ligne 4 identifiant du colis, ligne 5 événement, ligne 6 date etc. Il peut y avoir plusieurs milliers de ligne dans chaque fichier

    J'ai commencé par faire un BCP du fichier dans une table temporaire puis j'ai extrait l'information de chaque ligne ce qui donne une table qui ressemble à ceci :
    Ligne du fichier Identifiant Colis Evénement Date
    CNIxxxxxNNNNNxxxx NNNNN
    STS20xxxxxxxxxxxxLIVxxxxxxCFM LIVCFM
    DTMxxxxxxxxxx20140801xxxxxxxxx1002 01/08/2014 10:02

    Cette partie du traitement est relativement légère. Ce qui pose problème c'est de remettre toutes les informations relative à un colis sur une seule ligne et je n'ai pour le moment pas trouvé d'autre moyen qu'un curseur qui va générer autant de requête qu'il y a de ligne dans la table temporaire.

    Si quelqu'un a une idée géniale, je suis preneur !
    Merci

    Fred

  2. #2
    Membre émérite Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Par défaut
    Effectivement les curseurs c'est a éviter (voir bannir) , il sont généralement remplaçable par des CTE , Mais pour que l'on puisse te répondre au mieux ...

    Quel est l'info dans ta table permettant de relier les lignes d'un colis entre elles ?

    Peux-tu donner le code a optimiser ainsi que la définition de ta table (DDL) ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut
    Je suis d'accord avec toi ; quand on peut éviter les curseur ... mais là je n'ai pas du tout réussi à trouver une solution d'où mon appel à idée.

    Il n'y a pas de champs qui permette de regrouper les différentes lignes liées à un colis, c'est bien la le problème. La seule solution est de prendre les lignes dans l'ordre : ligne 1, 2 et 3 concerne le colis 1, les lignes 4, 5 et 6, le colis 2 etc.

    Ce n'ai pas vraiment une optimisation du code existant que je cherche, mais une idée qui me permettrait de me passer du curseur.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Dans une table, il n'y a pas de ligne 1, ligne 2, ligne 3. Il y a juste des lignes, qui n'ont aucun ordre !

    L'idéal serait sûrement d'utiliser un langage de programmation pour pivoter votre fichier source avant son insertion en base.
    A défaut, au moins numéroter les lignes afin de leur attribuer le fameux ordre manquant dans la base.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut
    Bonsoir,

    Les ligne peuvent être ordonnées en fonction d'un champ (j'ai ajouté un champ identity) donc le problème n'est pas vraiment là.

    Modifier le fichier avant le BCP est le plan B ...

  6. #6
    Membre émérite Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Par défaut Pivot
    Bonjour,

    Si tu es libre sur La structure de ta table temporaire contenant :

    Ligne du fichier Identifiant Colis Evénement Date
    CNIxxxxxNNNNNxxxx NNNNN
    STS20xxxxxxxxxxxxLIVxxxxxxCFM LIVCFM
    DTMxxxxxxxxxx20140801xxxxxxxxx1002 01/08/2014 10:02
    le plus judicieux est d'utilisé PIVOT http://technet.microsoft.com/en-us/l...=sql.105).aspx

    Pour ce faire je te conseil de modifier la structure de ta table comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table ColisAvantPivot
    (
    IdLignesColis int,
    TypeValeur varchar(50),
    Valeur varchar(50)
    )
    Donc après ton BCP et ton extraction de valeur tu aura dans cette table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IdLignesColis |TypeValeur	        |Valeur
    -----------------------------------------------
    0	            |IdentifiantColis	|NNNNN
    1	            |Evénement	        |LIVCFM
    2	            |Date	                |01/08/2014 10:02
    3	            |IdentifiantColis	|AAAAA
    4	            |Evénement	        |BADC
    5	            |Date	                |02/08/2014 11:05

    Puis tu Pivote ta table Via


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select 
       IDColis
       ,[IdentifiantColis]
       ,[Evénement]
       ,[Date]
    from 
            (Select (IDLignesColis-1)/3 as IDColis  , TypeValeur ,Valeur From dbo.colisAvantPivot) SourceTable
    Pivot
        (Min(Valeur)
         For TypeValeur In ([IdentifiantColis],[Evénement],[Date]))as pvt


    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IDColis	| IdentifiantColis  	|Evénement	|Date
    --------------------------------------------------------------
    0	        |NNNNN	                |LIVCFM	         |01/08/2014 10:02
    1	        |AAAAA	                |BADC	         |02/08/2014 11:05
    Ps L'ID Colis qui en résulte n'est pas a prendre comme PK , c'est juste un identifiant temporaire ....

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Takuan75 Voir le message
    Les ligne peuvent être ordonnées en fonction d'un champ (j'ai ajouté un champ identity) donc le problème n'est pas vraiment là.
    C'est une supposition optimiste et dangereuse...
    Que se passera-t-il par exemple si le moteur décide de paralléliser l'import du fichier ?

    Il ne me semble pas que bcp garantisse que l'ordre d'insertion des lignes dans la tables corresponde à leur ordre dans le fichier source. Mais effectivement, avec des petits fichiers et un peu de chance, ça devrait fonctionner dans la majorité des cas (typiquement, en dev), et échouer dans de très rares cas (typiquement, après la mise en prod, un week end, la nuit ).

    Je vous en courage a envisager plus sérieusement votre plan B !

Discussions similaires

  1. [AC-2010] Optimisation traitement sql
    Par F.ORTIZ dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/07/2013, 10h58
  2. [PHP 5.4] Optimisation des traitements (SQL)
    Par qltmi dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2013, 11h59
  3. Optimisation traitement SQL
    Par decisio dans le forum PL/SQL
    Réponses: 27
    Dernier message: 03/07/2012, 09h38
  4. [SQL] Optimisation temps de traitement PROC SQL
    Par amidujour dans le forum SAS Base
    Réponses: 2
    Dernier message: 13/10/2010, 20h16
  5. [AC-2007] Optimisation de traitements SQL sous VBA
    Par C_Kloug dans le forum VBA Access
    Réponses: 9
    Dernier message: 06/10/2009, 13h22

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