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 Stockée] Optimisation


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de lapanne
    Inscrit en
    Juin 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 200
    Par défaut [Procedure Stockée] Optimisation
    On me crie dessus parce que ma Procédure stockée est un peu longue à s'éxécuter

    Voilà une bestiole qui met 25 secondes à s'éxécuter pour afficher 4035 lignes. Question : Est-ce normal ? Quels peuvent être les éléments limitants ? Les types (varchar, text etc...) pourrait-ils être à l'origine de la lenteur d'éxécution ?

    D'avance, merci pour vos éclaircicements

    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
    SELECT	id_demande_demande_au_plan.id as id ,
    id_demande_demande_au_plan.id_demande_reel as id_demande_reel,
    id_demande_demande_au_plan.id_demande_au_plan as id_demande_au_plan,
    formation_plan = CASE DemandesAuPlan.guide WHEN 1 THEN (SELECT titre FROM Formations WHERE DemandesAuPlan.id_formation = Formations.id_formation)	WHEN 0 THEN (SELECT titre FROM Formations_Demandes WHERE DemandesAuPlan.id_formation = Formations_Demandes.id_formation) ELSE ' ' END,
    ISNULL(Plans_plan.nom,Plans.nom) as nom_plan,
    libelle_etat = CASE ISNULL(id_demande_demande_au_plan.id_demande_reel,-1) WHEN  -1 THEN 'Au Plan' ELSE (SELECT libelle_etat from etat_demande where demandes.etat = Etat_demande.id_etat) END,
    etat = CASE ISNULL(convert(varchar,id_demande_demande_au_plan.id_demande_reel),-1) WHEN -1 THEN '9' ELSE CONVERT(varchar(50),demandes.etat) END,
    nom_user_plan = ISNULL((SELECT nom FROM Utilisateurs WHERE DemandesAuPlan.id_utilisateur = Utilisateurs.id_utilisateur),' '),
    prenom_plan = ISNULL((SELECT prenom FROM Utilisateurs WHERE DemandesAuPlan.id_utilisateur = Utilisateurs.id_utilisateur),' '),
    DemandesAuPlan.id_utilisateur as id_utilisateur_au_plan,				nbre_heures_plan = CAST(DemandesAuPlan.nbre_heures as Decimal(18,2)),
    cout_pedagogique_plan = CAST(DemandesAuPlan.cout_pedagogique as Decimal(18,2)),				
    titre = CASE Demandes.guide WHEN 1 THEN Formations.titre WHEN 0 THEN Formations_Demandes.titre ELSE ' ' END,
    nbre_heures = CAST(Demandes.nbre_heures as numeric(18,2)),
    cout_pedagogique = CAST(Demandes.cout_pedagogique as numeric(18,2)),		Demandes.id_utilisateur,
    nom = ISNULL((SELECT nom FROM utilisateurs WHERE Demandes.id_utilisateur = Utilisateurs.id_utilisateur),' '),
    prenom = ISNULL((SELECT prenom FROM utilisateurs WHERE Demandes.id_utilisateur = Utilisateurs.id_utilisateur),' ')
     
    FROM id_demande_demande_au_plan 
    LEFT JOIN Demandes ON id_demande_demande_au_plan.id_demande_reel = Demandes.id_demande 
    LEFT JOIN DemandesAuPlan ON id_demande_demande_au_plan.id_demande_au_plan = DemandesAuPlan.id_demande 
    LEFT JOIN Plans ON Demandes.id_plan = Plans.id_plan
    LEFT JOIN Utilisateurs ON Demandes.id_utilisateur = Utilisateurs.id_utilisateur 
    LEFT JOIN Utilisateurs AS Utilisateurs_Responsable ON Demandes.id_responsable = Utilisateurs_Responsable.id_utilisateur
    LEFT JOIN Formations ON Demandes.id_formation = Formations.id_formation 
    LEFT JOIN Formations_Demandes ON Demandes.id_formation = Formations_Demandes.id_formation 			
    LEFT JOIN Plans as Plans_Plan ON DemandesAuPlan.id_plan = Plans_plan.id_plan 
    LEFT JOIN Formations as Formations_Plan ON DemandesAuPlan.id_formation = Formations_plan.id_formation 
    LEFT JOIN Utilisateurs as Utilisateurs_Plan ON DemandesAuPlan.id_utilisateur = Utilisateurs_plan.id_utilisateur 
    LEFT JOIN Utilisateurs AS Utilisateurs_Responsable_plan ON  DemandesAuPlan.id_responsable = Utilisateurs_Responsable_plan.id_utilisateur
    LEFT JOIN Formations_Demandes as Formations_Demandes_Plan ON DemandesAuPlan.id_formation = Formations_Demandes_plan.id_formation 
     
    WHERE (Plans.Annee = @annee OR Plans_plan.Annee = @annee) 
     
    ORDER BY id,nom_user_plan,prenom_plan,nom,prenom

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Peux-tu faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET SHOWPLAN_ALL ON
    GO
    Avant d'exécuter ce SELECT, et nous envoyer le résultat ?

    Sinon, quelques infos sur les outils d'optimisation : http://rudi.developpez.com/sqlserver.../optimisation/

  3. #3
    Membre expérimenté Avatar de lapanne
    Inscrit en
    Juin 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 200
    Par défaut
    merci pour le lien

    Voilà une capture du résultat du showplan_all. ça a l'air de bien poutrer, y'a plein de chiffres toussa, je vais me pencher dessus

    http://www.iwanu-ga-hana.fr//htdocs/Rssources/show_all.gif

    Le fichier excel tout moche

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    ce sont tes appels a la fonction isnull dans les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenom_plan = ISNULL((SELECT prenom FROM Utilisateurs WHERE DemandesAuPlan.id_utilisateur = Utilisateurs.id_utilisateur),' '),
    il vaut mieux que tu fasses un autre left outer join sur utilisateurs

  5. #5
    Membre expérimenté Avatar de lapanne
    Inscrit en
    Juin 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 200
    Par défaut
    Tu t'appuies sur le rapport showplan_all pour affirmer ça ? Parce que je pige pas tout au rapport, je me documente

    Sinon, j'ai virer tout les ISNULL, je tombe toujours entre 25 et 28 secondes de traitements

    Edit : en mettant un simple count(*) à la place de mes colonnes, je tombe à 24 secondes ce qui n'est pas vraiment flagrant comme delta

  6. #6
    Membre confirmé Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Par défaut
    4000 lignes c'est pas énorme, mais il faut voir les volumes de données de tes différentes tables.

    Déjà si tu pouvais t'arranger pour ne plus avoir les sous requetes dans les case et les isnull, tu devrais gagner beaucoup de temps. Passe par des jointures externes gauche comme dit plus haut.

+ 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 stocke non optimise.
    Par arnololo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/08/2005, 19h00
  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