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

SQL Firebird Discussion :

Amelioration de requete


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut Amelioration de requete
    J'ai une requete un peu "lourde" qui met du temps a s'executer et je voulais savoir si yavais pas un moyen de la faire autrement pour quelle soit plus rapide

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM GB_SUIVI WHERE 
    CODEPRODUIT='SCRAP' and SVERSION='2008' and CODENATURE='CDIP' and SDATE<> '01/01/0001' 
    and IDCLIENT in
    (SELECT IDCLIENT FROM GB_SUIVI WHERE 
    CODEPRODUIT='SCRAP' and SVERSION='1.0' and CODENATURE='TELEC' and SDATE<> '01/01/0001' )

    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.* FROM GB_SUIVI A 
    INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
    WHERE 
    A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001' 
    AND 
    B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'
    c'est pas mieux ?

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 80
    Points : 199
    Points
    199
    Par défaut
    C'est quoi la clé primaire et les index de GB_SUIVI ?

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    Desolé de repondre si tard mais j'ai du m'occupper d'un projet plus urgent.

    Les indexes de GB_SUIVI sont CODEPRODUIT, CODENATURE, SVERSION

    ID INTEGER
    IDCLIENT INTEGER
    CODEPRODUIT VARCHAR(12)
    CODENATURE VARCHAR(5)
    SVERSION VARCHAR(10)
    SDATE TIMESTAMP
    NOTE VARCHAR(200)

    Y'a pas de clef primaire de definit.

    La requete de makowski est un peu plus longue a s'executer (Statistic IBConsole)
    execution 00:00:20.0906
    Starting Memory 764848
    Current Memory 764660
    Delta Memory -188
    Number of buffer 0
    Reads 8
    Writes 0
    contre
    execution 00:00:07.0984
    Starting Memory 656180
    Current Memory 714712
    Delta Memory 58532
    Number of buffer 0
    Reads 423
    Writes 1
    pour la mienne.
    Je sais pas trop ce que ca veux dire tous ces trucs^^

  5. #5
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    pas clé primaire ?????
    c'est la base toute table doit avoir une clé primaire

    c'est quoi le plan des deux requetes ?

  6. #6
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    voici les plans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Statement: SELECT * FROM GB_SUIVI WHERE
    CODEPRODUIT='SCRAP' AND SVERSION='2008' AND CODENATURE='CDIP' AND SDATE<> '01/01/0001'
    AND IDCLIENT IN
    (SELECT IDCLIENT FROM GB_SUIVI WHERE
    CODEPRODUIT='SCRAP' AND SVERSION='1.0' AND CODENATURE='TELEC' AND SDATE<> '01/01/0001' )
     
    PLAN (GB_SUIVI INDEX (IDXGBSUIVXALL))
    PLAN (GB_SUIVI INDEX (IDXGBSUIVXALL))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Statement: SELECT A.* FROM GB_SUIVI A
    INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
    WHERE
    A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
    AND
    B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'
     
    PLAN JOIN (A INDEX (IDXGBSUIVXALL),B INDEX (IDXGBSUIVXALL))
    Je peux avoir un ptite explication de ce que ca veux dire tout ca parceque je comprend pas trop^^

    Pour ma defense c'est pas moi qui ai créé les tables et mon IBConsole bug a chaque fois que je veux faire un truc sur les tables donc j'arrive pas a mettre de clé primaire...

    [edit] : je suis allé faire un tit tour dans la BD : 51 tables et seulement 16 qui ont une cle primaire

  7. #7
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    mouais
    il te faudrait un autre outil que cette vieillerie d'ibconsole (database workbench par exemple)
    que tu donnes les stats des requetes
    la structure des tables et index
    et la version de Firebird

  8. #8
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    Je crois que s'est firebird 2 qui est utilisé

    Structure GB_SUIVI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID INTEGER   NOT NULL    PRIMARY KEY 
    IDCLIENT INTEGER
    CODEPRODUIT VARCHAR(12)
    CODENATURE VARCHAR(5)
    SVERSION VARCHAR(10)
    SDATE TIMESTAMP
    NOTE VARCHAR(200)
    Les indexes de GB_SUIVI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CODEPRODUIT, CODENATURE, SVERSION
    =========================================================

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM GB_SUIVI WHERE
    CODEPRODUIT='SCRAP' AND SVERSION='2008' AND CODENATURE='CDIP' AND SDATE<> '01/01/0001'
    AND IDCLIENT IN
    (SELECT IDCLIENT FROM GB_SUIVI WHERE
    CODEPRODUIT='SCRAP' AND SVERSION='1.0' AND CODENATURE='TELEC' AND SDATE<> '01/01/0001' )
    Stats:
    Server Memory
    Current 720,87Kb
    Max 787,24Kb
    Buffers 2048

    Indexed 4 691 257
    préparé en 0.046s, executé en 2.438s

    =========================================================

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.* FROM GB_SUIVI A
    INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
    WHERE
    A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
    AND
    B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'

    Stats:
    Server Memory
    Current 715,84Kb
    Max 782,21Kb
    Buffers 2048

    Indexed 6 441 354
    preparé en 0.219s, executé en 6.547sec



    Voila j'espere que c'est complet^^

  9. #9
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    et ça retourne combien de lignes ?

  10. #10
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par makowski Voir le message
    et ça retourne combien de lignes ?
    366 avec ta methode et 359 avec la mienne
    ya un ptit probleme quelque part^^

  11. #11
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    le problème c'est qu'il lit trop d'enregistements
    tu peux essayer de faire un index (CODEPRODUIT, CODENATURE, SVERSION, IDCLIENT) ?

    Mais avant ça, c'est quoi le but de la requête en français ?

  12. #12
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    La BD contient des clients. A chaque fois qu'ils achetent ou telecharge un produit il y a un nouvel enregistrement (avec le meme idclient).

    Le but de cette requete c'est de recuperer tout ceux qui ont telecharger et acheté le produit SCRAP, mais si s'etait si simple que ca...

    En fait il y a une interface pour que ceux qui ne savent pas faire de requete puisse en faire.L'interface est composé de liste deroulante de la forme
    1- liste_produit liste_version liste_nature liste_date
    Chaque ligne est une condition et c'est enregisrté dans une table pour pouvoir la reutilser sans la reconstruire.

    Aprés pour executer la requete :
    je dois recuperer les conditions dans la table et construire la requete.

  13. #13
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    essaie aussi ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.* FROM GB_SUIVI A WHERE
    A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
    AND EXISTS
    (SELECT B.IDCLIENT FROM GB_SUIVI B WHERE A.IDCLIENT=B.IDCLIENT AND
    B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001' )

  14. #14
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    Je viens de tester elle met 4s a s'executer et a a peu prés les meme stats que la mienne.

    Par contre je sais pas si je cherche dans le bon sens parceque le gros probleme c'est pour une requete de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.* FROM GB_SUIVI A WHERE
    A.CODEPRODUIT='SCRAP' AND A.SVERSION='1.0' AND A.CODENATURE='TELEC' AND A.SDATE<> '01/01/0001'
    AND NOT EXISTS
    (SELECT B.IDCLIENT FROM GB_SUIVI B WHERE A.IDCLIENT=B.IDCLIENT AND
    B.CODEPRODUIT='GENEA' AND B.CODENATURE='CDIP' AND B.SDATE<> '01/01/0001' )
    (->not)

    Je me suis dit quand ameliorant la simple sa ameliorerai celle-ci aussi (ce qui doit etre le cas) mais il serait peut etre plus judicieux que je me concentre sur cette derniere? Je l'ai executer :

    Préparé en 0.031s executé en 43.922s
    stats:
    Server Memory
    Current 729,37Kb
    Max 828,16Kb
    Buffers 2048

    Indexed 32 750 231
    C'est un peu mieux que ce que je faisait et la y'en a que deux mais il peux en avoir plus...

  15. #15
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    L'ordre des index est important?
    j'ai modifié mon index comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IDCLIENT, CODEPRODUIT, CODENATURE
    et ca va beaucoup plus vite.

    En fait le probleme c'etait la base et pas les requetes^^

    Merci beaucoup pour ton aide makowski

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

Discussions similaires

  1. [PDO] amelioration d'une requete
    Par arckaniann dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 16/12/2013, 19h35
  2. [AC-2007] Amelioration de la requete
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/01/2011, 08h35
  3. Amelioration de requete
    Par xian21 dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/01/2009, 11h20
  4. [MySQL] Amélioration Requête SQL
    Par Biboune2006 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/07/2006, 15h27

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