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 :

Optimisation d'une requete


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut Optimisation d'une requete
    Bonjour,

    Je voudrais savoir comment pourrais-je optimiser la requete ci dessous. Elle prend trop de temps, plus de 25s. Sachant que la table CHILDORDERSTATUS contient 20.000 lignes, CHILDORDERID 6000 lignes et INSTRUMENT 5 l.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select AVG(cast(cos.PRICE as DOUBLE)) 
    from CHILDORDERSTATUS cos 
    where cos.CHILDORDERID 
        IN (SELECT co.CHILDORDERID FROM CHILDORDER co  
                                              WHERE co.SIDE = 's' 
                                              and  co.INSTRUMENTID 
                                                    IN (SELECT inst.INSTRUMENTID FROM INSTRUMENT inst WHERE inst.VENUE = 'X' ))
    Les tables j'ai pas le droit de les changer. La BD est une BD HSQLBD chargé en mémoire installée sur un poste distant.

    Voila je crois que j'ai tout dit.

    Meric pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Est-ce que vos tables sont indexées ?

  3. #3
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    Je viens de trouver un article très intéressant d'un membre de developpez.com
    http://sqlpro.developpez.com/cours/optimiser/#L8
    je pense que ça va bq m'aider Merci sqlpro

  4. #4
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    oui elles sont indexées, j'ai appliquée quelques conseils de SQLpro, j'ai pu gagné un temps fou par rapport à mes 25s mnt c'est 2à3s, c'est bq mieux.

    Je voudrais bien gagner encore plus si c'est possible.

    Les tables sont indexées mais tous les champs figurant ds le where ne sont pas indexés. Malheureusement j'ai pas la main sur cette base, il faut passer par qlq un d'autres pour rajouter cela au cas ou c'est très important.

    voila ma nouvelle requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select AVG(cast(cos.PRICE as DOUBLE)) from CHILDORDERSTATUS cos where EXISTS (SELECT * FROM CHILDORDER co where  co.SIDE = 'b' and cos.CHILDORDERID = co.CHILDORDERID and EXISTS (SELECT * FROM INSTRUMENT inst WHERE inst.VENUE = 'TQ' and co.INSTRUMENTID = inst.INSTRUMENTID ))
    par exemple ds cette requete, la table CHILDORDER à parmi ces indexes CHILDORDERID (la clé) mais pas SIDE, meme chose pour INSTRUMENT , elle a INSTRUMENTID (la clé) mais pas VENUE

    Merci

  5. #5
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Est-ce que des jointures ne serait pas plus performantes ? A tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM CHILDORDERSTATUS cos 
    WHERE EXISTS (
    	SELECT * 
    	FROM CHILDORDER co 
    		JOIN INSTTRUMENT inst
    			USING(INSTRUMENTID)
    	WHERE  co.SIDE = 'b' 
    	AND inst.VENUE = 'TQ'
    	AND cos.CHILDORDERID = co.CHILDORDERID
    )
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM CHILDORDERSTATUS cos
    	JOIN CHILDORDER co
    		ON cos.CHILDORDERID = co.CHILDORDERID
    		JOIN INSTTRUMENT inst
    			ON co.INSTRUMENTID = inst.INSTRUMENTID
    WHERE  co.SIDE = 'b' 
    AND inst.VENUE = 'TQ'
    Un index sur CHILDORDERSTATUS(CHILDORDERID, SIDE) serait certainement bénéfique. Pour la table INSTRUMENT, je ne pense pas, elle est tellement petite que ce n'est pas pertinent.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Que donnent les jointures?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
          AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM CHILDORDERSTATUS cos 
    JOIN CHILDORDER co ON cos.CHILDORDERID = co.CHILDORDERID
    JOIN INSTRUMENT inst ON co.INSTRUMENTID = inst.INSTRUMENTID
    WHERE co.SIDE = 'b'
    AND inst.VENUE = 'TQ'

  7. #7
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    Merci pour vos retours

    j'essaye de tester avec les join mais j'ai une erreur que je n'arrive pas à trouver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
          AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM CHILDORDERSTATUS cos 
    JOIN CHILDORDER co ON cos.CHILDORDERID = co.CHILDORDERID
    JOIN INSTRUMENT inst ON co.INSTRUMENTID = inst.INSTRUMENTID
    WHERE co.SIDE = 'b'
    AND inst.VENUE = 'TQ'
    peut être c'est une question de parenthèse

    Unexpected token: JOIN in statement

  8. #8
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Le message d'erreur semble vouloir dire qu'il n'accepte pas le mot JOIN, ce qui est pour le moins étrange étant donné que je lis ici que HSQLDB :
    supporte une grande partie des standards SQL-92, SQL-99, et SQL:2003.
    Essaie de préciser INNER JOIN au cas où il serait sourcilleux sur la syntaxe.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Je ne connais pas hsqlbd, peut être en ajoutant le mot-clé inner, généralement facultatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
          AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM CHILDORDERSTATUS cos 
    INNER JOIN CHILDORDER co ON cos.CHILDORDERID = co.CHILDORDERID
    INNER JOIN INSTRUMENT inst ON co.INSTRUMENTID = inst.INSTRUMENTID
    WHERE co.SIDE = 'b'
    AND inst.VENUE = 'TQ'
    Sinon, jointure à l'ancienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
          AVG(cast(cos.PRICE AS DOUBLE)) 
    FROM 
         CHILDORDERSTATUS cos, 
         CHILDORDER co,
         INSTRUMENT inst
    WHERE cos.CHILDORDERID = co.CHILDORDERID
    AND co.INSTRUMENTID = inst.INSTRUMENTID
    AND co.SIDE = 'b'
    AND inst.VENUE = 'TQ'
    Mais c'est moche.

    Edit: Encore grillé, c'est pas mon jour

  10. #10
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    C'est ce que je me suis dit moi aussi mais j'ai cherché ds la doc HSQLDB et il utilise effectivement le JOIN dans leur exemple.

    J'ai essayé avec le INNER JOIN, ça marche mnt j'ai trouvé aussi une autre erreur de frappe (INSTTRUMENT)

    mnt il exécute la requête en moins de 100ms c trop cool

    Merci bq

  11. #11
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Points : 231
    Points
    231
    Par défaut
    Je vais essayer de demander à rajouter plus d'index ds mes tables, pour essayer de gagner encore en perf

    merci pour votre

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

Discussions similaires

  1. Optimisation d'une requete "TOP 5"
    Par gregb34 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/05/2006, 18h17
  2. Réponses: 5
    Dernier message: 14/04/2006, 19h58
  3. Optimisation d'une requete récurrente
    Par winzou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/01/2006, 23h07
  4. Optimisation d'une requete specifique
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/12/2005, 15h14
  5. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 17h58

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