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 :

procedure stocke non optimise.


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Points : 8
    Points
    8
    Par défaut [RESOLU] procedure stocke non optimise.
    Bonjour,

    Voici ma procedure stockee, qui ma pris pas mal de temp a develloper et qui me renvoiles information que je veux. Le probleme , c'est que la performance de cette procedure est tres mauvaise et tres longue.

    Merci pour vos idee afin de l'optimiser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT DISTINCT dateend,active,Tparts.idpart,TParts.Namepart, 
    COALESCE( (SELECT     SUM(nb)  FROM   TEChart   WHERE      TEChart.part = TParts.idpart and qc=0  and DateInsp>=@start and DateInsp<=@end),0)  AS review 
    ,COALESCE((SELECT     SUM(nb)
                                FROM          TEChart
                                WHERE      TEChart.part = TParts.idpart and TEchart.qc = @concern   and DateInsp>=@start and DateInsp<=@end),0) AS reject,
                         COALESCE
                              ((SELECT     - DATEDIFF(day, GETDATE(), MAX(DateInsp))
                                  FROM         TEchart
                                  WHERE     TEchart.QC <> 0 AND TEchart.part = TParts.idPart
                                  GROUP BY TEchart.part),
                              (SELECT     - DATEDIFF(day, GETDATE(),
                                                           (SELECT     datestart
                                                             FROM          Tproject
                                                             WHERE      idproject= @project)))) AS jour
    FROM Tparts,TPartQC
    WHERE Tparts.project=@project and TPartQC.qc=@concern  and TPartQC.part=Tparts.idpart 
    order by reject DESC,active DESC,review DESC

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Pas étonnant avec cette somme de DISTINCT, de GROUP BY et de sous-selects avec agrégats.

    Ne pourriez-vous pas essayer de réécrire cela via jointures plutôt que sous-selects imbriqués ? En découpant les processus dans une procédures stockée, par exemple ?
    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 !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 839
    Points : 52 932
    Points
    52 932
    Billets dans le blog
    5
    Par défaut
    1) identez proprement vos requêtes pour les rendre lisible
    2) utilisez le prédicat BETWEEN
    3) utilisez des jointures pas du WHERE !
    4) utilisez des alias
    5) placez des index aux bon endrroits
    6) comme le dit fadace, faites des jointures plutôt que des sous requêtes

    Votre requête récrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    SELECT DISTINCT dateend, active, 
           Tparts.idpart, TParts.Namepart,
           COALESCE((SELECT SUM(nb)  
                     FROM   TEChart   
                     WHERE  TEChart.part = TParts.idpart 
                       and  qc=0  
                       and  DateInsp >= @start and DateInsp <= @end)
                    ,0)  AS review,
           COALESCE((SELECT SUM(nb)
                     FROM   TEChart
                     WHERE  TEChart.part = TParts.idpart 
                       and  TEchart.qc = @concern   
                       and DateInsp>=@start and DateInsp<=@end)
                    ,0) AS reject,
           COALESCE((SELECT DATEDIFF(day, GETDATE(), MAX(DateInsp))
                     FROM   TEchart
                     WHERE  TEchart.QC <> 0
                       AND  TEchart.part = TParts.idPart
                     GROUP  BY TEchart.part),
          (SELECT DATEDIFF(day, GETDATE(), (SELECT datestart
                                            FROM   Tproject
                                            WHERE  idproject= @project)))) AS jour
     
     
    FROM Tparts,
         TPartQC
     
    WHERE Tparts.project=@project 
      and TPartQC.qc=@concern  
      and TPartQC.part=Tparts.idpart
     
    order by reject DESC, active DESC, review DESC
    Voici une autre façon de faire votre requête sans sous reqsuêtes :
    (pas garantie car vous n'avez pas repecté ceci : http://www.developpez.net/forums/viewtopic.php?t=32668)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    SELECT DISTINCT dateend, active, 
           PT.idpart, PT.Namepart,
           COALESCE(SUM(TC1.nb), 0) AS review,
           COALESCE(SUM(TC2.nb), 0) AS reject,
           COALESCE(DATEDIFF(day, GETDATE(), MAX(TC3.DateInsp)),
                    DATEDIFF(day, GETDATE(), PJ.datestart)) AS jour
     
    FROM Tparts PT
         INNER JOIN TPartQC QC
               ON PT.idpart = QC.part
         INNER JOIN TEChart TC1
               ON TC1.part = PT.idpart
         INNER JOIN TEChart TC2
               ON TC2.part = PT.idpart
                  AND TC2.qc = QC.qc
         INNER JOIN TEChart TC3
               ON TC3.part = PT.idpart
         INNER JOIN Tproject PJ
               ON PT.project = PJ.idproject
     
    WHERE PT.project = @project 
      and QC.qc = @concern  
      and TC1.qc =0
      and TC1.DateInsp BETWEEN @start and  @end
      and TC2.DateInsp BETWEEN @start and  @end
      and TC3.QC <> 0
     
    GROUP BY TC3.part, dateend, active, PT.idpart, PT.Namepart, TC3.DateInsp, PJ.datestart
     
    order by reject DESC, active DESC, review DESC
    Pour ce qui est d'écrire du SQL, mon site comme mon bouquin vous serait sans doute très utile !


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Est-ce qu'on ne gagne pas un peu de performance en diminuant le nombre de jointures (pas testé sur des données ...) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT dateend, active, PT.idpart, PT.Namepart, 
           COALESCE(SUM(CASE WHEN TC.qc =0 
                              AND TC.DateInsp BETWEEN @start and  @end
                             THEN TC.nb
                             ELSE 0 END), 0) AS review, 
           COALESCE(SUM(CASE WHEN TC.DateInsp BETWEEN @start and  @end 
                              AND TC.qc = @concern    
                             THEN TC.nb
                             ELSE 0 END), 0) AS reject, 
           COALESCE(DATEDIFF(day, GETDATE(), MAX(CASE WHEN TC.QC <> 0 
                                                      THEN TC.DateInsp
                                                      ELSE NULL END )) , 
                    DATEDIFF(day, GETDATE(), PJ.datestart)) AS jour 
     
    FROM Tparts PT INNER JOIN TPartQC  QC ON PT.idpart  = QC.part 
                   INNER JOIN TEChart  TC ON TC.part    = PT.idpart 
                   INNER JOIN Tproject PJ ON PT.project = PJ.idproject 
    WHERE PT.project = @project 
     AND  QC.qc      = @concern
    GROUP BY dateend, active, PT.idpart, PT.Namepart, PJ.datestart 
    ORDER BY reject DESC, active DESC, review DESC
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 8
    Points : 8
    Points
    8
    Par défaut s
    MErci beaucoup pour votre aide, vos precieux conseil m'on permis de resoudre mon probleme

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Optimisation] Procedure stocké, index
    Par SiOuZ dans le forum Développement
    Réponses: 1
    Dernier message: 10/03/2011, 10h31
  2. optimisation procedure stocké
    Par karimoos dans le forum PL/SQL
    Réponses: 4
    Dernier message: 14/05/2010, 13h58
  3. optimisation procedure stocké
    Par karimoos dans le forum PL/SQL
    Réponses: 11
    Dernier message: 11/05/2010, 19h03
  4. [Procedure Stockée] Optimisation
    Par lapanne dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 28/06/2007, 09h38
  5. procedure stocke non optimise.
    Par arnololo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/02/2005, 16h34

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