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 :

Problème de lenteur procedure stockées


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 229
    Points : 60
    Points
    60
    Par défaut Problème de lenteur procedure stockées
    Bonjour messieurs,

    J'ai mis en place en une application de gestion avec Delphi7 et une base de données SQL Server 2005.
    Pour l'affichage de données dans mes formulaires j'appelle des procédures stockées depuis ma base sur le serveur.

    Mais j'ai un soucis de lenteur quand je lance l'affichage de mes données qui exécute la procédure stockée.
    Je constate aussi que pour la 1ère fois l'exécution de la procédure est très lente mais il y a une net amélioration à la prochaine exécution sans fermer l'application.

    Je ne comprend pas cela et je souhaite qu'on m'aide à améliorer le temps de réponse.
    voici le code de ma procédure :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
     
    ALTER PROCEDURE [dbo].[Get_DemandeClt_by_Client] 
    @Code_Clt varchar(20) 
    AS 
    BEGIN 
        SELECT T_DemandeClt.[pk_DemandeClt] 
          ,T_DemandeClt.[Date_Piece] 
          ,T_DemandeClt.[fk_Client] 
          ,T_DemandeClt.[Code_Clt]   
          ,T_DemandeClt.[Interlocuteur] 
          ,T_DemandeClt.[Tel_Interlocut] 
          ,T_DemandeClt.[Fax_Interlocut] 
          ,T_DemandeClt.[Besoins_exprimes]  
          ,T_DemandeClt.[fk_Travail_A_Faire] 
          ,T_DemandeClt.[fk_Prestation] 
          ,T_DemandeClt.[fk_CentreProfit] 
          ,T_DemandeClt.[fk_RespActivite] 
          ,T_DemandeClt.[fk_Transport] 
          ,T_DemandeClt.[Date_Demande] 
          ,T_DemandeClt.[Date_Souhaitee] 
          ,T_DemandeClt.[Date_Limite_Client] 
          ,T_DemandeClt.[Date_Limite_ABB] 
          ,T_DemandeClt.[Date_Limite] 
          ,T_DemandeClt.[Date_Traitement]
          ,T_DemandeClt.[fk_Action] 
          ,T_DemandeClt.[fk_Fournisseur] 
          ,T_DemandeClt.[fk_TypeAchat]  
          ,T_DemandeClt.[Date_Remise]  
          ,T_DemandeClt.[Num_Devis]  
          ,T_DemandeClt.[Montant_HT]  
          ,T_DemandeClt.[Production_Cost] 
          ,T_DemandeClt.[Gross_Margin]  
          --,T_DemandeClt.[Interet]
          ,T_DemandeClt.[fk_Resultat]   
          ,T_DemandeClt.[Reception_BC]   
          ,T_DemandeClt.[Date_BC]   
          ,T_DemandeClt.[Num_BC]   
          ,T_DemandeClt.[Date_Livr_Reelle]   
          ,T_DemandeClt.[Date_Livr_Previ]    
          ,T_DemandeClt.[Date_Livr_MAJ]   
          ,T_DemandeClt.[Num_Facture]   
          ,T_DemandeClt.[Facturation_Situation] 
          ,T_DemandeClt.[fk_Operatrice]  
          ,T_DemandeClt.[Enregistree_Par]   
          ,T_DemandeClt.[Transmis_A]   
          ,T_DemandeClt.[Date_Transmission]    
          ,T_DemandeClt.[Observation]    
          ,T_DemandeClt.[Observation2]    
          ,T_DemandeClt.[Indice]    
          ,T_DemandeClt.[Material_Cost] 
          ,T_DemandeClt.[Date_Saisie]
          ,T_DemandeClt.[Date_Restituee]  
          ,T_Prestation.Description as Prest_Desc 
          ,T_CentreProfit.Description as Centre_Desc 
     
          ,Resp.Prenom as Resp_Centre
     
          ,Com.Prenom as Commercial 
          ,T_Action_A_Faire.Description as Desc_Action 
          ,T_Fournisseur.Fournisseur 
          ,T_TypeAchat.Description as Desc_Achat
          ,T_Transport.Mode_Transport     
     
    FROM T_DemandeClt
    ,T_Prestation
    ,T_CentreProfit
    ,T_Employe Resp    
    ,T_Employe Com
    ,T_Action_A_Faire
    ,T_Fournisseur
    ,T_TypeAchat 
    ,T_Transport        
    where     
     
    (T_DemandeClt.fk_Prestation=T_Prestation.pk_Prestation) and     
     (T_CentreProfit.pk_CentreProfit=T_Prestation.fk_CentreProfit) and     
     (T_CentreProfit.fk_Resp=Resp.pk_Employe ) and         
     (T_DemandeClt.fk_Action=T_Action_A_Faire.pk_Action) and        
     (T_DemandeClt.Transmis_A=Com.pk_Employe) and        
     (T_DemandeClt.fk_Fournisseur=T_Fournisseur.pk_Fournisseur) and 
     (T_DemandeClt.fk_TypeAchat=T_TypeAchat.pk_TypeAchat) and    
     (T_DemandeClt.fk_Transport=T_Transport.pk_Transport)  and    
      T_DemandeClt.Code_Clt=@Code_Clt     
     
    END
    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    1. Quel est le temps de reponse de cette procedure stockees dans Management Studio ?
    2. Quel est le temps de reponse dans l'application ?
    3. Combien de ligne cette procedure te retourne-t-elle ?
    4. Comment affiches-tu ces donnees via ton application ?

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    C'est assez normal que le temps de réponse soit plus long la première fois. Le moteur SQL met en mémoire les données nécessaires pour traiter ta requête, et les laisses en mémoire un certain temps s'il n'a pas besoin de la place occupée par celle-ci. Lors de la 2ème exécution tes données (ou une partie s'il n'a pas pu tout mettre en mémoire) sont donc déjà disponibles en mémoire.

    Exécute ta PS en ajoutant SET STATISTICS IO ON avant l'appel (hors de l'application, via SQL Server Management Studio), ça permettra de connaitre le nombre de pages lues en mémoires et sur le DD.

    Quelques pistes :
    Peut être que la mémoire vive n'est pas suffisante sur ton serveur. Il y a d'autres choses qui tournent sur celui-ci ?
    Vérifier le partitionnement des index existants.
    Il peut être judicieux de créer des index sur les fk.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 229
    Points : 60
    Points
    60
    Par défaut
    Bonjour,
    merci pour votre réponse.
    Oui Il y a d'autres applications qui tournent sur le serveur.
    Mais je voudrais savoir si n'y a pas une instruction à ajouter sur ma procédure stockée ou bien une configuration à faire sur ma base afin d'améliorer la performance.

    Merci!

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Est ce que tu peux mesurer uniquement le temps d'exécution de la procédure stockée et le temps total de l'appel à la procédure stockée ? C'est peut être l'ouverture et la fermeture de la connexion qui prend du temps et non pas l'exécution.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 229
    Points : 60
    Points
    60
    Par défaut
    merci,

    Pour 200 lignes:

    Depuis Management Studio j'ai une durée qui varie entre 0 et 02 secondes et
    Depuis mon application c'est à dire à l'appel j'ai environ 03 à 05 secondes à la première ouverture.
    NB: Rapide lors d'une seconde ouverture.

    Mais j'ai pensé aussi au temps de connexion mais je ne sais pas comment y remédier.
    Vous pourriez m'aider aussi à accélérer le temps de connexion.

    Merci

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Beaucoup d'horreur dans cette requête :
    1) des jointures dans le WHERE !!! Vous avez 20 ans de retard !!! Ou avez-vous apris SQL ? Dans une pochette surprise ??? A lire : http://sqlpro.developpez.com/cours/s...intures/#LII-B
    2) vous avez oublié de préfixer vos objets par leur schéma SQL (par défaut dbo). Cela oblige le serveur à effectuer une résolution de nom pour chaque table
    3) vous avez acheté un lot de parenthèses aux enchères et vous ne savez pas quoi en faire ???
    4) savez-vous ce qu'est un alias de table ????????

    Commencez donc par récrire la requête ainsi :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    SELECT D.[pk_DemandeClt] 
          ,D.[Date_Piece] 
          ,D.[fk_Client] 
          ,D.[Code_Clt]   
          ,D.[Interlocuteur] 
          ,D.[Tel_Interlocut] 
          ,D.[Fax_Interlocut] 
          ,D.[Besoins_exprimes]  
          ,D.[fk_Travail_A_Faire] 
          ,D.[fk_Prestation] 
          ,D.[fk_CentreProfit] 
          ,D.[fk_ERActivite] 
          ,D.[fk_Transport] 
          ,D.[Date_Demande] 
          ,D.[Date_Souhaitee] 
          ,D.[Date_Limite_Client] 
          ,D.[Date_Limite_ABB] 
          ,D.[Date_Limite] 
          ,D.[Date_Traitement]
          ,D.[fk_Action] 
          ,D.[fk_Fournisseur] 
          ,D.[fk_TypeAchat]  
          ,D.[Date_Remise]  
          ,D.[Num_Devis]  
          ,D.[Montant_HT]  
          ,D.[Production_Cost] 
          ,D.[Gross_Margin]  
          --,D.[Interet]
          ,D.[fk_Resultat]   
          ,D.[Reception_BC]   
          ,D.[Date_BC]   
          ,D.[Num_BC]   
          ,D.[Date_Livr_Reelle]   
          ,D.[Date_Livr_Previ]    
          ,D.[Date_Livr_MAJ]   
          ,D.[Num_Facture]   
          ,D.[Facturation_Situation] 
          ,D.[fk_Operatrice]  
          ,D.[Enregistree_Par]   
          ,D.[Transmis_A]   
          ,D.[Date_Transmission]    
          ,D.[Observation]    
          ,D.[Observation2]    
          ,D.[Indice]    
          ,D.[Material_Cost] 
          ,D.[Date_Saisie]
          ,D.[Date_Restituee]  
          ,P.Description AS Prest_Desc 
          ,CP.Description AS Centre_Desc 
     
          ,ER.Prenom AS ER_Centre
     
          ,EC.Prenom AS ECmercial 
          ,AAF.Description AS Desc_Action 
          ,F.Fournisseur 
          ,TA.Description AS Desc_Achat
          ,T.Mode_Transport     
     
    FROM T_DemandeClt AS D
         INNER JOIN T_Prestation AS P
               ON D.fk_Prestation=P.pk_Prestation
         INNER JOIN T_CentreProfit AS CP
               ON CP.pk_CentreProfit=P.fk_CentreProfit
         INNER JOIN T_Employe AS ER
               ON CP.fk_ER=ER.pk_Employe 
         INNER JOIN T_Employe AS EC 
               ON D.Transmis_A=EC.pk_Employe
         INNER JOIN T_Action_A_Faire AS AAF
               ON D.fk_Action=AAF.pk_Action
         INNER JOIN T_Fournisseur AS F
               ON D.fk_Fournisseur=F.pk_Fournisseur
         INNER JOIN T_TypeAchat AS TA
               ON D.fk_TypeAchat=TA.pk_TypeAchat
         INNER JOIN T_Transport AS T     
               ON D.fk_Transport=T.pk_Transport   
    WHERE  D.Code_Clt=@Code_Clt;
    Avez vous un index sur : T_DemandeClt (Code_Clt) ?

    Toutes vos Foreign Keys sont indexées ?

    Enfin, dernière remarque, votre table T_DemandeClt me semble "obèse".... A lire sur le sujet : http://blog.developpez.com/sqlpro/p1...ances-petites/

    Et pour appendre le SQL, lisez mon site ou mon bouquin !!!

    A +

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 229
    Points : 60
    Points
    60
    Par défaut
    Merci pour votre réponse et les liens.
    Je vais donc lire ces liens et essayer d'optimiser davantage ma base.
    Mais comment préfixer mes objets par leur schéma quand vous parlez de :
    2) vous avez oublié de préfixer vos objets par leur schéma SQL (par défaut dbo). Cela oblige le serveur à effectuer une résolution de nom pour chaque table
    Il s'agit t-il de :
    BD_Sysvm.dbo.T_DemandeClt
    Merci pour votre aide et je continuerais à m'améliorer.

Discussions similaires

  1. Lenteur Procedure stockée entre 2 serveurs liés
    Par spanot dans le forum Réplications
    Réponses: 1
    Dernier message: 16/04/2010, 19h35
  2. Problème avec les procedures stockées.
    Par saymon dans le forum Développement
    Réponses: 1
    Dernier message: 14/04/2009, 14h50
  3. problème de syntaxe (procedures stockées)
    Par diamentelle dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/02/2009, 02h15
  4. Problème avec une procedure stockée
    Par freud dans le forum SQL
    Réponses: 8
    Dernier message: 21/07/2008, 20h20
  5. problème de syntaxe procedure stockée
    Par chti_juanito dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/04/2007, 16h03

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