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 :

amélioration de cette requête


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut amélioration de cette requête
    Bonjour à tous. Je cherche à améliorer cette requête car dès qu'il y beaucoup de données, l'affichage du résultat est trop long
    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
      SELECT
      FAMILLES."Libelle Famille",
      DEMANDEDACHAT."Code Sous Famille",
      SOUSFAMILLES."Libelle Sous Famille",
      DEMANDEDACHAT."Nom Fournisseur",
      DEMANDEDACHAT."Qte cmd",
      DEMANDEDACHAT."PU Devise",
      DEMANDEDACHAT."Numero Bon Cmde",
      DEMANDEDACHAT."Date Bon Cmde",
      DEMANDEDACHAT."Etat Cmde",
      DEMANDEDACHAT."Numero Bon de Livraison",
      DEMANDEDACHAT."Date Bon de Livraison",
      DEMANDEDACHAT."Numero Bon Exped Chantier",
      DEMANDEDACHAT."Date Exped Chantier",
      DEMANDEDACHAT."Numero Facture",
      DEMANDEDACHAT."Date Facture",
      DEMANDEDACHAT."Mode Expedition",
      DEMANDEDACHAT."Date Livraison Siege",
      DEMANDEDACHAT."Numero Facture Siege",
      DEMANDEDACHAT."Date Facture Siege"
    FROM
      DEMANDEDACHAT
      INNER JOIN FAMILLES ON (DEMANDEDACHAT."Code Famille" = FAMILLES."Code Famille")
      INNER JOIN SOUSFAMILLES ON (DEMANDEDACHAT."Code Sous Famille" = SOUSFAMILLES."Code Sous Famille")
    WHERE
      DEMANDEDACHAT."Date SOGEMAT" BETWEEN ((SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT) -7) AND (SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT)
    ORDER BY
      DEMANDEDACHAT."DA SOGEMAT" DESC
    en faites, il s'agit d'une requête qui me retourne les saisies effectuées les 7 dernières jours

    MErci
    On progresse .....

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Quels sont les index définis sur ces tables ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    En faite DEMANDEDACHAT est une vue mais la table en question a les index sur les champs suivant :
    Date Sogemat
    Code Sous Famille
    Code Famille

    Sinon, est ce qu'il y a une methode plus approprié.
    Voila.
    On progresse .....

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour Andry,

    Quel version de firebird utilises tu ?

    Peux tu nous donner le plan de cette requête ?
    (ou à défaut les ordres créates de tes tables et vues)

    Le nombre de données qui sont présentes dans tes tables

    Et l'ordre SQL de cette vue.

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Bonjour Baribulle
    La version que j'ai actuellement est 1.5.1.4481
    Alors, voici le détails de la Vue DemandeAchat:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    CREATE VIEW DEMANDEDACHAT(
        "Numero Interne",
        "Periode",
        "Lieu Achat",
        "DA Chantier",
        "DA SOGEMAT",
        "Date SOGEMAT",
        "Etat Cotation",
        "Date Decision",
        "Code Chantier",
        "Libelle Chantier",
        "Affectation",
        "Nom Demandeur",
        "Ref Article",
        "Libelle Article",
        "Code Famille",
        "Code Sous Famille",
        "Nom Fournisseur",
        "Code Devise",
        "Qte cmd",
        "Cours Moyen Devise",
        "PU Devise",
        "Total Devise",
        "PU Local",
        "Total Local",
        "Cours Moyen Euro",
        "PU Euro",
        "Total Euro",
        "Numero Bon Cmde",
        "Date Bon Cmde",
        "Etat Cmde",
        "Numero Bon de Livraison",
        "Date Bon de Livraison",
        "Numero Bon Exped Chantier",
        "Date Exped Chantier",
        "Numero Facture",
        "Date Facture",
        "Mode Expedition",
        "Date Livraison Siege",
        "Numero Facture Siege",
        "Date Facture Siege",
        "Observation",
        "Operateur")
    AS
    SELECT
        DA.DA_ID,
        DA.DA_PERIODE,
        LIEU.LIE_LIB AS DA_LIBLIEU,
        DA.DA_NUMDA,
        DA.DA_NUMDASOG,
        DA.DA_DATEDASOG,
        DA.COT_CODE,
        DA.DA_DATECOT,
        DA.CHA_CODE,
        CHANTIER.CHA_NOM,
        DA.DA_AFFECTATION,
        DEMANDEUR.DEM_NOM,
        ARTICLE.ART_REF,
        ARTICLE.ART_LIB,
        ARTICLE.FAM_CODE,
        ARTICLE.SFA_CODE,
        FOURNISSEUR.FRS_NOM,
        DA.DEV_CODE,
        DA.DA_QTECMD,
        DA.DA_CMDEVISE,
        DA.DA_PUDEVISE,
        (DA.DA_PUDEVISE * DA_QTECMD),
        DA.DA_PULOCAL,
        (DA.DA_PULOCAL * DA_QTECMD),
        DA.DA_CMEURO,
        DA.DA_PUEURO,
        (DA.DA_PUEURO * DA_QTECMD),
        DA.DA_BDCNUM,
        DA.DA_BDCDATE,
        DA.DA_DBCETAT,
        DA.DA_BLNUM,
        DA.DA_BLDATE,
        DA.DA_BENUM,
        DA.DA_BEDATE,
        DA.DA_FACNUM,
        DA.DA_FACDATE,
        DA.MEX_CODE,
        DA.DA_SIEGEDTBL,
        DA.DA_SIEGEFACNUM,
        DA.DA_SIEGEFACDT,
        DA.DA_OBSERV,
        PROFIL.PRF_USER
    FROM DA
       LEFT JOIN PROFIL ON (DA.PRF_ID = PROFIL.PRF_ID)
       LEFT JOIN DEMANDEUR ON (DA.DEM_ID = DEMANDEUR.DEM_ID)
       LEFT JOIN CHANTIER ON (DA.CHA_CODE = CHANTIER.CHA_CODE)
       LEFT JOIN FOURNISSEUR ON (DA.FRS_ID = FOURNISSEUR.FRS_ID)
       LEFT JOIN ARTICLE ON (DA.ART_ID = ARTICLE.ART_ID)
       LEFT JOIN LIEU ON (DA.LIE_CODE = LIEU.LIE_CODE)
    Sachant que j'ai des indexe sur
    • DA_DATEDASOG de DA
    • DA_ID de DA
    • PRF_ID de PROFIL et DA
    • DEM_ID de DEMANDEUR et DA
    • CHA_CODE de CHANTIER et DA
    • FRS_ID de FOURNISSEUR et DA
    • ART_ID de ARTICLE et DA
    • LIE_CODE de LIEU et DA
    Actuellement
    • la table DA compte 13500 lignes
    • la table Article compte 8000 lignes
    Le plan depuis IbExpert :
    PLAN JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (DEMANDEDACHAT DA NATURAL,DEMANDEDACHAT PROFIL INDEX (PK_PROFIL)),DEMANDEDACHAT DEMANDEUR INDEX (PK_DEMANDEUR)),DEMANDEDACHAT CHANTIER INDEX (PK_CHANTIER)),DEMANDEDACHAT FOURNISSEUR INDEX (PK_FOURNISSEUR)),DEMANDEDACHAT ARTICLE INDEX (PK_ARTICLE)),DEMANDEDACHAT LIEU INDEX (PK_LIEU))
    PLAN JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (DEMANDEDACHAT DA NATURAL,DEMANDEDACHAT PROFIL INDEX (PK_PROFIL)),DEMANDEDACHAT DEMANDEUR INDEX (PK_DEMANDEUR)),DEMANDEDACHAT CHANTIER INDEX (PK_CHANTIER)),DEMANDEDACHAT FOURNISSEUR INDEX (PK_FOURNISSEUR)),DEMANDEDACHAT ARTICLE INDEX (PK_ARTICLE)),DEMANDEDACHAT LIEU INDEX (PK_LIEU))
    PLAN SORT (JOIN (MERGE (SORT (JOIN (SOUSFAMILLES SOUSFAMILLE NATURAL,SOUSFAMILLES FAMILLE INDEX (PK_FAMILLE))),SORT (JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (DEMANDEDACHAT DA NATURAL,DEMANDEDACHAT PROFIL INDEX (PK_PROFIL)),DEMANDEDACHAT DEMANDEUR INDEX (PK_DEMANDEUR)),DEMANDEDACHAT CHANTIER INDEX (PK_CHANTIER)),DEMANDEDACHAT FOURNISSEUR INDEX (PK_FOURNISSEUR)),DEMANDEDACHAT ARTICLE INDEX (PK_ARTICLE)),DEMANDEDACHAT LIEU INDEX (PK_LIEU)))),FAMILLES FAMILLE INDEX (PK_FAMILLE)))
    Voilà
    On progresse .....

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Ce qui est certain c'est que sous fb1.5 (peut etre sous 2.x également)

    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DEMANDEDACHAT."Date SOGEMAT" BETWEEN ((SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT) -7) AND (SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT)
    est lourd car il va balayer 2 fois la table pour obtenir le max de la date.

    Donc déjà de faire une PS sera plus rentable ou 2 requetes (une pour le max de la date) et la seconde avec le between Date1 and Date2

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Barbibulle,
    le problème c'est que je ne peux pas utiliser une procédure stocké. En faite, le soft en question possède une module qui permet de créer et d'exécuter des requêtes suivant le besoin du client. C'est pour cela que j'ai du créer les vues afin de faciliter la création des requêtes.

    Voilà.
    On progresse .....

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Et de le faire en 2 requetes ca serait possible ?

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Déjà cette requete devrait être beaucoup plus rapide :
    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
      SELECT
      FAMILLES."Libelle Famille",
      DEMANDEDACHAT."Code Sous Famille",
      SOUSFAMILLES."Libelle Sous Famille",
      DEMANDEDACHAT."Nom Fournisseur",
      DEMANDEDACHAT."Qte cmd",
      DEMANDEDACHAT."PU Devise",
      DEMANDEDACHAT."Numero Bon Cmde",
      DEMANDEDACHAT."Date Bon Cmde",
      DEMANDEDACHAT."Etat Cmde",
      DEMANDEDACHAT."Numero Bon de Livraison",
      DEMANDEDACHAT."Date Bon de Livraison",
      DEMANDEDACHAT."Numero Bon Exped Chantier",
      DEMANDEDACHAT."Date Exped Chantier",
      DEMANDEDACHAT."Numero Facture",
      DEMANDEDACHAT."Date Facture",
      DEMANDEDACHAT."Mode Expedition",
      DEMANDEDACHAT."Date Livraison Siege",
      DEMANDEDACHAT."Numero Facture Siege",
      DEMANDEDACHAT."Date Facture Siege"
    FROM
      DEMANDEDACHAT
      INNER JOIN FAMILLES ON (DEMANDEDACHAT."Code Famille" = FAMILLES."Code Famille")
      INNER JOIN SOUSFAMILLES ON (DEMANDEDACHAT."Code Sous Famille" = SOUSFAMILLES."Code Sous Famille")
    WHERE
      DEMANDEDACHAT."Date SOGEMAT" BETWEEN ((SELECT MAX(DA.DA_DATEDASOG) FROM DA) -7) AND (SELECT MAX(DA.DA_DATEDASOG) FROM DA)
    ORDER BY
      DEMANDEDACHAT."DA SOGEMAT" DESC

  10. #10
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Alors là tu as raison.
    Cette requête est très rapide.
    Prepare time = 31ms
    Execute time = 766ms
    Donc le passage par la vue ralenti enormement l'execution de la requête.

    Encor merci
    On progresse .....

  11. #11
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    Ce qui est certain c'est que sous fb1.5 (peut etre sous 2.x également)

    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DEMANDEDACHAT."Date SOGEMAT" BETWEEN ((SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT) -7) AND (SELECT MAX(DEMANDEDACHAT."Date SOGEMAT") FROM DEMANDEDACHAT)
    est lourd car il va balayer 2 fois la table pour obtenir le max de la date.
    Est-ce qu'un index DESC sur DEMANDEDACHAT."Date SOGEMAT" n'améliorerait pas les perfs de cette partie ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  12. #12
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui bien vu, mais pas sur DEMANDEDACHAT."Date SOGEMAT" puisque c'est une vue mais sur la table DA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE DESCENDING INDEX DA_IDX_DATEDASOG ON DA (DA_DATEDASOG);
    Cela évite de balayer toute la table pour obtenir le max.

    Merci qi130

  13. #13
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Effectivement, J'ai déjà mis un index DESC sur DA_DATEDASOG.
    Merci à vous deux.
    On progresse .....

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

Discussions similaires

  1. es ce que cette requête est possible
    Par stan21 dans le forum Access
    Réponses: 2
    Dernier message: 01/02/2006, 10h22
  2. Cette requête est-elle valide?
    Par FrankOVD dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/01/2006, 19h21
  3. Pourquoi cette requête est lente ?
    Par zenzo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2006, 15h15
  4. Que fait cette requête?
    Par noinneh dans le forum Langage SQL
    Réponses: 8
    Dernier message: 12/10/2005, 19h38
  5. expliqué cette requête
    Par ismailsalam dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 29/09/2005, 14h10

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