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

Développement SQL Server Discussion :

Optimisation requête avec jointure externe SQL Server


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Optimisation requête avec jointure externe SQL Server
    Bonjour à tous,

    Petite question SQL, sur un requête avec jointure externe.

    J'ai une base avec deux tables, une comprenant une liste d'entrée avec un ID (T1.item), des champs d'info (T1.UseTime, T1.Code, T1.Status, T1.Qty) et une autre table avec tous les ID possibles des Item (T2.itemID) présent dans la première table.

    L’objectif est de récupérer toutes avec un UseTime, un Code et un Status donné sur tous les item qui existent, pas seulement ceux retournées par la une requête sur T1.

    Exemple :
    T1.Item;T2.itemID;Sum(T1.Qty)

    1;1;950
    2;2;1986
    3;3;NULL
    4;4;54
    5;5;NULL

    et pas seulement

    1;1;950
    2;2;1986
    4;4;54

    J'ai donc utilisé le SQL suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.item, T2.itemID, Sum(T1.Qty)
    FROM database.dbo.table1 T1 RIGHT OUTER JOIN database.dbo.table2 T2
    ON T1.item = T2.itemID AND (T1.UseTime>='2011-09-01 00:00:00' AND T1.UseTime<='2011-09-02 00:00:00') AND (T1.Code=0 AND T1.Status=23 )
    GROUP BY T1.item, T2.itemID
    ORDER BY T1.item, T2.itemID
    Le résultat est OK. Par contre le temps d’exécution me parait un peu long (10s).

    Si j’essaye de voir le plan d’exécution estimé de la requête, j’ai l’impression que le moteur fait :

    - Une requête liste itemID de la table T2

    - Pour chaque itemID retourné, une requête sur la table T1 (soit 70 ! car il y a 70 itemID).

    Est-t-il possible d'optimiser cette requête? Je ne connais pas très bien les mécanismes SQL Server.

    Merci d’avance de votre expertise.

  2. #2
    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 : 42
    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,

    C'est le plan d'exécution réel qu'il vous faut : il s'obtient en pressant CTRL+M avant l'exécution de la requête, dans SQL Server Management Studio.
    A la fin de l'exécution de la requête, un nouvel onglet va s'afficher, vous donnant le plan d'exécution réel.

    Vous pouvez précéder celle-ci de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET STATISTICS IO ON
    GO
    Ce qui vous donnera le nombre d'IO produites contre chaque table.
    Avec cet indice et le plan de requête réel, je suis sûr que vous allez trouver l'index manquant.

    A priori je dirai qu'il vous manque un index sur la colonne T1.Item.
    D'autre part le calcul d’agrégats (SUM(), COUNT(), ...) sur une colonne qui n'est pas indexée peut s'avérer long.

    Si vous ne trouvez pas de solution, postez le plan d'exécution réel.

    @++

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Au passage votre requête gagnerait à être écrite de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T2.item, T1.itemID, Sum(T2.Qty)
    FROM   DATABASE.dbo.table2 T1 
           LEFT OUTER JOIN dbo.table1 T2
                ON  T2.item = T1.itemID 
                AND T2.UseTime >= '2011-09-01' 
                AND T2.UseTime <= '2011-09-02'
    WHERE  T2.Code=0 
      AND  T2.STATUS=23 
    GROUP BY T2.item, T1.itemID
    ORDER BY T2.item, T1.itemID
    Pour l'optimiser, rajoutez les index suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T2 (Code, STATUS, item, UseTime) INCLUDE (Qty)
    T1 (ItemId) -- sauf s'il existe déjà
    Testez votre requête telle quelle et voyez aussi si la récriture suivante :

    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
    SELECT T2.item, T1.itemID, Sum(T2.Qty)
    FROM   DATABASE.dbo.table2 T1 
           INNER JOIN dbo.table1 T2
                ON  T2.item = T1.itemID 
                AND T2.UseTime >= '2011-09-01' 
                AND T2.UseTime <= '2011-09-02'
    WHERE  T2.Code=0 
      AND  T2.STATUS=23 
    GROUP BY T2.item, T1.itemID
    UNION ALL
    SELECT NULL, T1.itemID, 0
    FROM   DATABASE.dbo.table2 T1 
    WHERE  NOT EXISTS(SELECT * 
                      FROM   dbo.table1 T2
                      WHERE  T2.item = T1.itemID 
                        AND  T2.UseTime >= '2011-09-01' 
                        AND  T2.UseTime <= '2011-09-02'
                        AND  T2.Code=0 
                        AND  T2.STATUS=23)
    ORDER BY 1, 2
    Donne le même résultat, mais plus rapidement.

    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/ * * * * *

Discussions similaires

  1. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  2. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  3. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50
  4. requête avec jointure externe
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/04/2006, 10h29
  5. Requête avec jointure externe
    Par claralavraie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/02/2006, 08h34

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