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

Langage SQL Discussion :

SOS pour optimiser ma requete sous DB2


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut SOS pour optimiser ma requete sous DB2
    Bonjour,
    tout est dans le titre. La requete ci dessous s'execute en 6 minutes
    La table Demande compte 7500 entree et la table Salarie environ 20 000 entrees.
    Merci d'avance

    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
     
    Select ....
    From Demande Dmd, Corp Crp, Salarie Sal, Structure Str
    Where 
    Dmd.col1 = 9999
    And Dmd.kode In (0,1)
    And Dmd.cree = 
    (
        Select Max(dmd2.cree) 
        From Demande Dmd2 
        Where Dmd2.col1 = Dmd.col1
        And Dmd2.numsal = Dmd.numsal
        And Dmd2.kode In (0,1)
        And Current Date >= Dmd2.ddebvlt 
    )
    And Sal.col1 = Dmd.col1
    And Sal.numsal = Dmd.numsal
    And Crp.col1 = Dmd.col1
    And Crp.idcrp = 7777
    And Str.col1 = Sal.col1
    And Str.refstr = Sal.refstr
     
    And Exists
    (
        Select 1
        From Corpstr Crpstr
        Where Crpstr.col1 = Crp.col1
        And Crpstr.idcrp = Crp.idcrp
        And Fonction1(crp.col1,sal.refstr,crpstr.refstr) = 1
    )

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    utilise les balises "code" pour colorer le code.

    tu as mis des index sur tes tables ?


    tu peux aussi essayer de passer par des tables intermédiaires pour éviter la sous requête avec le max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    And Dmd.cree = 
    (
    Select Max(dmd2.cree) 
    From Demande Dmd2 
    Where Dmd2.col1 = Dmd.col1
    And Dmd2.numsal = Dmd.numsal
    And Dmd2.kode In (0,1)
    And Current Date >= Dmd2.ddebvlt 
    )

  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 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    a) 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
    SELECT ....
     
    FROM Demande Dmd
         INNER JOIN Corp Crp
               ON Dmd.col1 = Crp.col1
         INNER JOIN Salarie Sal
               ON Dmd.col1 = Sal.col1
                  AND Dmd.numsal = Sal.numsal
         INNER JOIN Structure Str
               ON Str.col1 = Sal.col1
                  AND Str.refstr = Sal.refstr
     
    WHERE Dmd.col1 = 9999
      AND Dmd.kode IN (0,1) -- si possible remplacer par : Dmd.kode BETWEEN 0 AND 1
      AND Crp.idcrp = 7777
      AND Dmd.cree = (SELECT Max(dmd2.cree) 
                      FROM   Demande Dmd2 
                      WHERE  Dmd2.col1 = Dmd.col1
                        AND  Dmd2.numsal = Dmd.numsal
                        AND  Dmd2.kode IN (0,1) -- si possible remplacer par : Dmd2.kode BETWEEN 0 AND 1
                        AND  Dmd2.ddebvlt <= Current Date)
    AND EXISTS (SELECT *
                FROM   Corpstr Crpstr
                WHERE  Crpstr.col1 = Crp.col1
                  AND  Crpstr.idcrp = Crp.idcrp
                  AND  Fonction1(crp.col1,sal.refstr,crpstr.refstr) = 1) -- pouvez vous remplacer cette fonction par du pur SQL ?
    b) Les index suivant existent-ils ?

    1) demande (Col1)
    2) Corp (Col1)
    3) Salarie (col1, NumSal)
    4) Structure (col1, refstr
    5) demande (kode)
    6) demande (cree)
    7) demande (col1, numsal, ddebvlt, kode)
    8) Corpstr (col1, idcrp)
    9) corp (col1, odcrp)

    sinon, voir si les créer améliore les temps de réponse (essais un à un par rapport au plan de requête).

    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par SQLpro
    a) 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
    SELECT ....
     
    FROM Demande Dmd
         INNER JOIN Corp Crp
               ON Dmd.col1 = Crp.col1
         INNER JOIN Salarie Sal
               ON Dmd.col1 = Sal.col1
                  AND Dmd.numsal = Sal.numsal
         INNER JOIN Structure Str
               ON Str.col1 = Sal.col1
                  AND Str.refstr = Sal.refstr
     
    WHERE Dmd.col1 = 9999
      AND Dmd.kode IN (0,1) -- si possible remplacer par : Dmd.kode BETWEEN 0 AND 1
      AND Crp.idcrp = 7777
      AND Dmd.cree = (SELECT Max(dmd2.cree) 
                      FROM   Demande Dmd2 
                      WHERE  Dmd2.col1 = Dmd.col1
                        AND  Dmd2.numsal = Dmd.numsal
                        AND  Dmd2.kode IN (0,1) -- si possible remplacer par : Dmd2.kode BETWEEN 0 AND 1
                        AND  Dmd2.ddebvlt <= Current Date)
    AND EXISTS (SELECT *
                FROM   Corpstr Crpstr
                WHERE  Crpstr.col1 = Crp.col1
                  AND  Crpstr.idcrp = Crp.idcrp
                  AND  Fonction1(crp.col1,sal.refstr,crpstr.refstr) = 1) -- pouvez vous remplacer cette fonction par du pur SQL ?
    b) Les index suivant existent-ils ?

    1) demande (Col1)
    2) Corp (Col1)
    3) Salarie (col1, NumSal)
    4) Structure (col1, refstr
    5) demande (kode)
    6) demande (cree)
    7) demande (col1, numsal, ddebvlt, kode)
    8) Corpstr (col1, idcrp)
    9) corp (col1, odcrp)

    sinon, voir si les créer améliore les temps de réponse (essais un à un par rapport au plan de requête).

    A +
    Merci pour vos reponses. Je teste cette solution et je reviens vers vous.

    Seules les tables suivantes ont des clés :
    demande (col1, NumSal,cree)
    Corpstr (col1, idcrp,refstr)
    corp (col1, idcrp)

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    ne t'étonne donc pas des performances lamentables ...

    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. Réponses: 0
    Dernier message: 07/08/2013, 17h51
  2. Aide pour Optimiser une Requete
    Par Thanwiel dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/12/2007, 10h31
  3. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  4. [Mysql4] Un peu d'adie pour optimiser ma requete
    Par ePoX dans le forum Requêtes
    Réponses: 10
    Dernier message: 03/12/2005, 16h31
  5. Aide pour optimiser une requete
    Par Akanath dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 11h05

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