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

MS SQL Server Discussion :

Conseil sur un traitement


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut Conseil sur un traitement
    Bonjour,

    Je voudrais quelques conseilles sur un traitement que je dois effectuer.

    un fichier Excel qui contient environ 5000 lignes doit être comite sur une table qui execute un trigger lourd (normalement quand j'ajoute une ligne le comite de la ligne dans la table qui execute le trigger dur environ 15-20 secondes) donc je me dis que l'insertion des 5000 lignes va être coton...

    Ainsi je voudrais savoir si le mieux était de faire un agent SQL server (job) qui execute automatiquement l'importation du fichier excel dans cette table qui executera donc le trigger... Est-ce exacte ?

    le problème est si le trigger dur 15-20secondes pour une ligne un comite de 5000 va le faire saturer...?

    Peut-on faire une exécution ligne par ligne en temporisant pour ne pas avoir de problème d'importation ?? Si oui comment faire ?

    Avez vous des tutoriels ou de la documentation pour Newbie sur les jobs ?
    car j'ai rien trouvé de tuto pour les jobs... En revanche j'ai trouvé pour le SSIS.

    Merci par avance pour vos réponses !

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    15-20 secondes, c'est beaucoup pour un trigger...
    La première chose à faire est de voir si vous ne pouvez vous en passer, au moins l'optimiser

    Faire ligne par ligne sera sûrement pire que mieux, d'ailleurs, il est possible (en fonction de ce qu'il fait) que votre trigger mette a peine plus de temps pour 5000 lignes que pour une seule... avez vous testé avec un echantillon (une centaine de ligne par exemple, pour voir le temps, et évaluer le comportement du trigger lors de l'insertion de plusieurs lignes en meme temps)

    Actuellement, comment (et par qui) est peuplée la table sur laquelle se trouve le trigger, et que fait le trigger (postez le code si vous le pouvez)

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je suis entièrement d'accord avec aieeeuuuuu.

    Votre trigger :

    - est peut-être mal codé
    - est peut-être optimisable
    - doit manquer d'index pour supporter le requêtes qu'il exécute.

    Donc, sans le code de celui-ci est la structure de la table à laquelle il est attaché, difficile de vous aider.

    @++

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Je ne peux pas poster le code de celui-ci malheureusement

    Cependant, la table contient des règles (certaines règles sont plus spécifiques et d'autre plus générique) de génération de planning qui sont liées entre elles et qui s'autocompletent via le trigger pour générer un planning...

    Il faut environ 5000 règles pour générer le planning et à chaque fois que j'ajoute modifie ou supprime une règle, je dois vérifier mes autres règles et regarder les dépendances, etc.

    Cela permet d'éviter de la saisie redondante pour l'utilisateur. Et ça fait lui fait gagner des jours de saisies manuelles qui n'étaient pas très lucratives

    Le problème n'est pas l'ajout d'une règle mais de l'ajout au départ des 5000 règles pour avoir un planning de base dans la BDD

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Si votre TRIGGERest bien codé (de manière ensembliste et non par CURSOR par exemple).
    Il ne durera peut-être pas beaucoup plus avec 5000 lignes car celles-ci seront traité en une seule fois...

    Avez vous un plan d’exécution pour ce trigger?

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    voici le plan en image
    Pardon et les stats I/O?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    voici les plans d'exécution du trigger soit toutes les requêtes qu'il fait.

    Je pense que c'est lourd aussi de traiter de ça dans un trigger

    donc je me demande si il ne faudrait pas séparer les traitements du trigger en fragmentant la table et créer plusieurs tables et faire un enchainement de trigger.

    Encore une fois je pense que c'est la nature de ce que doit faire le trigger qui est long (créer un planning et générer quantités de liaisons et de lignes par rapport à une seule ligne insérer par l'utilisateur).

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je pense que c'est lourd aussi de traiter de ça dans un trigger.
    Votre TRIGGER est clairement très lourd et s'appuie sur de nombreuses tables temporaire.
    Il vous manque également des index (TablesScans, dans une moindre mesure index scan)...

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    le trigger possède deux tables temporaires... pensez vous qu'il serait envisageable de créer ces tables temporaires en tables en créant un domaine "génération de règle" serait-il plus performant ?

    Enfin pouvez vous m'en dire plus pour TablesScan scan ?

    les tables possèdent des indexes sur les clés primaires et étrangères des tables et un indexe sur l'une des tables temporaires ? Est ce utile de faire un index sur une table temporaire dans un trigger ou la table sera supprimée à la fin de l'exécution du trigger ? A noter que le trigger travaille essentiellement sur les tables temporaires. Ne faudrait il pas mieux travailler sur de réelle table ?

    Merci d'avance

  10. #10
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Difficile d'en dire plus sans le code, mais vous faites une boucle. (j'ai l'impression que vous faites pire qu'utiliser un curseur, vous en simulez le fonctionnement)

    Je pense qu'il doit être possible de vous passer de votre boucle par quelques requêtes, qui ne seront peut être pas simples à écrire, mais qui seront très probablement beaucoup plus performantes.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    ben j'ai fait des boucles pour éviter les curseurs en suivant ce tuto

    http://sqlpro.developpez.com/cours/s...r_avoidCursor/

  12. #12
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    oui, mais vous vous êtes basé sur la partie 3 du tuto j'ai l'impression. Cette partie utilise une table temporaire, pour lancer une commande qui ne peut concerner qu'une table (recalcul des statistiques)

    Je ne pense pas que cela soit votre cas, et vous devriez plutôt faire comme dans la partie 1 (ou la partie 2)

  13. #13
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je ne peux pas poster le code de celui-ci malheureusement
    Pour des raisons de confidentialité?

    Dans ce cas modifiez vos requètes en renommant des champs en nommant vos tables A et B etc. que nous puission refaires celles-ci

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Pour des raisons de confidentialité?
    voici une partie je ne peux pas mettre plus.

    Mais si vous me dites comment changer la boucle en requête ou d'autre optimisation considérable sur ce code. Je pense que ça sera pas mal

  15. #15
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par lerieure Voir le message
    voici une partie je ne peux pas mettre plus.
    831 lignes... c'est déjà pas mal

    Je ne pensais pas si bien dire quand je disais que ce ne serait sans doute pas simple de passer tout ça en quelques requêtes

    Disons qu'il y a un peu de travail...

  16. #16
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Mais si vous me dites comment changer la boucle en requête ou d'autre optimisation considérable sur ce code. Je pense que ça sera pas mal

    O çà tombe mal je dois partir en vacance pendant deux mois


    Non sérieusement ça va être coton de "rentrer" dans votre code!
    Des INSERT des UPDATE des TOP 1 dans tout les sens sur vos table TEMP...


    Et peu de commentaire...

  17. #17
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    moi non plus je ne peux pas le faire, je dois partir en vacances dans deux mois

    cela dit, j'ai bien l'impression que votre trigger ne gérera pas les insertions multilignes :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT TOP 1 
    ...
    FROM INSERTED

  18. #18
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    moi non plus je ne peux pas le faire, je dois partir en vacances dans deux mois

    Parfait... vous commencez la refonte pendant ces deux prochain mois et je prends la suite à mon retour ... quand on peut s'arranger...

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Difficile d'en dire plus sans le code, mais vous faites une boucle. (j'ai l'impression que vous faites pire qu'utiliser un curseur, vous en simulez le fonctionnement)

    Je pense qu'il doit être possible de vous passer de votre boucle par quelques requêtes, qui ne seront peut être pas simples à écrire, mais qui seront très probablement beaucoup plus performantes.
    Je vais regarder si c'est possible d'optimiser le traitement

    mais en terme de performance c'est mieux une boucle ou un curseur?
    après je me doute que c'est mieux une requête simple mais si c'est pas possible c'est quoi le mieux ?

  20. #20
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    le problème est si le trigger dur 15-20secondes pour une ligne
    ?
    mais si c'est pas possible
    Pour moi c'est deux phrases se contredisent... vous devez clairement tenter de supprimer le maximum de code iteratif dans votre traitement...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Demande Conseils sur envoi vers serveur et traitement XML
    Par anthride dans le forum Silverlight
    Réponses: 1
    Dernier message: 15/11/2010, 17h49
  2. [MySQL] Conseil sur traitement des données
    Par Feng-Huang dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 07/01/2009, 12h16
  3. Conseil sur une bibliothèque de traitement d'image
    Par fumidu dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2006, 12h31
  4. [débutant] conseils sur contraintes et alter table
    Par maysa dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 26/05/2004, 09h03
  5. Recherche Livre / Conseils sur la conception de Base
    Par Yeuma dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 02/01/2004, 14h25

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