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 :

Optimisation d'une requête


Sujet :

MS SQL Server

  1. #1
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut Optimisation d'une requête
    2006 arrive a grands pas et depuis maintenant 4jours, nous avons décider de faire le grand nettoyage dans la base de données pour supprimer les donénes inutiles et optimiser les traitements. on a reussi à obtenir du 800% d'ameliorations sur certaines requetes qui n'etaient pas du tout optimisées.
    Si certaines choses nous ont sauté aux yeux pour les ameliorer, ce n'est pas le cas pour toutes.
    ainsi, cette requete repond parfaitement à son travail: pour chacun des douzes derniers mois, calculés les reglements recus par le gestionnaire: en somme, assez simple, ce qui donne d'apres l'ex-dba (qui n'en n'etait pas un)
    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     SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 11 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois1, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 10 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois2, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 9 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois3, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 8 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois4, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 7 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois5, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 6 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois6, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 5 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois7, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 4 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois8, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 3 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois9, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 2 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois10, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) - 1 THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois11, 
               SUM(CASE WHEN MONTH(dbo.T_REGLEMENT.rgt_date_reception) = MONTH(getdate()) THEN T_REGLEMENT_DETAIL.rgd_montant ELSE 0 END) AS mois12
    FROM       T_REGLEMENT INNER JOIN
               T_REGLEMENT_DETAIL ON T_REGLEMENT.rgt_id = T_REGLEMENT_DETAIL.rgt_id INNER JOIN
               T_DOSSIER ON T_REGLEMENT_DETAIL.dos_id = T_DOSSIER.dos_id INNER JOIN
               T_PERSONNEL ON T_DOSSIER.prs_id = T_PERSONNEL.prs_id
    WHERE     (dbo.T_PERSONNEL.prs_login = @Tg)
    maintenant, humbles programmeurs que nous sommes aimerions l'optimiser (elle et plusieurs autres procedures). Je ne vais pas vous demander de les optimiser pour nous, nous allons devoir apprendre à le faire.

    Nous avons utiliser l'analyser de requete compris dans SQL Server Studio (2005) qui nous sort un beau diagramme avec des hash, des select, du parallelism et plein d'autres grots mots barbares avec à chaque fois un pourcentage.
    avec la requete ci-dessus, aucune "tache" ne prend plus de 10%cpu mais cela veut-il dire qu'elle est optimisée?
    plus generalement, quelqu'un connait-il un livre, article, specifique, à la comprehension de l'analyseur de requete?


    d'avance merci
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  2. #2
    Invité
    Invité(e)
    Par défaut
    As-tu regardé dans le BOL ? A la rubrique "Analyseur de requêtes SQL, volet Plan d'exécution" entre autre...

  3. #3
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    dans mon BOl a part de la soupe... je ne sais pas ce que c'est.

    mais si par le plan d'execution, tu parles du diagramme généré, oui, je le vois bien et justement, il n'est pas parlant mais pas parlant du tout

    il me dis a trois endroits qu'il scann une table sans index (ca je sais, je les y ai enlevé pour le moment) mais il me parle de "hash match" de "parallelism" ou encore une etape "bitmap" ayant pour phrase de description: "bitmap"

    mais par exemple, j'ai un "strem aggregrate" qui est suivi par un "parallelism" resuivi d'un "stream aggregate" puis d'un "compute scalar". bref, autant je comprend le langage SQL autant je ne comprend rien à ce plan d'executation "censé" m'aider
    c'est justement sur ce plan d'execution que je cherche des docs claires, pas forcément pour debutant mais un point de depart
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est bien ce que je dis, dans le BOL (Books On Line), à l'endroit que je t'ai indiqué, tu trouveras les explications détaillées des hash match, parallelism etc...

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    c'est de suite plus clair. je vais y refaire un tour car la premiere fois, je n'y ai pas trouvé ce que je voulais, il y a bien des exemples simples avec une table où il est marqué en gros que c'est sans index donc on trouve l'origine.

    bref, jvais devoir fouiller un peu plus

    merci
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  6. #6
    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
    Essayez donc plutôt :

    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
    SELECT     COALESCE(CASE WHEN MOIS_RGT = MOIS_RGT - 11 THEN SUM(MONTANT) END), 0) AS mois1,
               COALESCE(CASE WHEN MOIS_RGT = MOIS_RGT - 10 THEN SUM(MONTANT) END), 0) AS mois2,
                  ...
               COALESCE(CASE WHEN MOIS_RGT = MOIS_RGT      THEN SUM(MONTANT) END), 0) AS mois12
    FROM
    (
    SELECT     RD.rgd_montant AS MONTANT,
               MONTH(R.rgt_date_reception) AS MOIS_RGT,
               MONTH(CURRENT_TIMESTAMP) AS MOIS_COURANT
    FROM       dbo.T_REGLEMENT R
               INNER JOIN dbo.T_REGLEMENT_DETAIL RD
                     ON R.rgt_id = RD.rgt_id 
               INNER JOIN dbo.T_DOSSIER D
                     ON RD.dos_id = D.dos_id 
               INNER JOIN dbo.T_PERSONNEL P 
                     ON D.prs_id = P.prs_id
    WHERE     dbo.T_PERSONNEL.prs_login = @Tg
    ) T
    mais pour ma part je ferais cette présentation par mois du côté client, en partant de la requête suivante qui produira les mêmes résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT     SUM(RD.rgd_montant) AS SUM_MONTANT,
               MONTH(CURRENT_TIMESTAMP) - MONTH(R.rgt_date_reception) AS DIFFERENCE_MOIS
    FROM       dbo.T_REGLEMENT R
               INNER JOIN dbo.T_REGLEMENT_DETAIL RD
                     ON R.rgt_id = RD.rgt_id 
               INNER JOIN dbo.T_DOSSIER D
                     ON RD.dos_id = D.dos_id 
               INNER JOIN dbo.T_PERSONNEL P 
                     ON D.prs_id = P.prs_id
    WHERE     dbo.T_PERSONNEL.prs_login = @Tg
    GROUP BY  MONTH(R.rgt_date_reception)
    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/ * * * * *

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

Discussions similaires

  1. Optimisation d'une requête de recherche
    Par Bobtop dans le forum Requêtes
    Réponses: 16
    Dernier message: 14/06/2006, 16h27
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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