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 :

Optimisation requête SQL 2


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut Optimisation requête SQL 2
    Bonjour,
    je souhaiterais obtenir pour un client précis toutes lignes d'un BL pour lequel l'état du lancement n'est pas soldé ou annulée et il n'y a pas de commande (CDE_ID=0).
    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NO_Offre
    FROM
     ((BL_LIGNE BLL  INNER JOIN BL_ENTETE BLE ON BLE.LISTENOBL_ID=BLL.LISTENOBL_ID and BLE.CLIENT_ID=433)
     INNER JOIN LANCEMENT LCT ON  BLL.LCT_ID=LCT.LCT_ID  and LCT.ETAT_ID<>2 AND LCT.ETAT_ID<>5 and LCT.CDE_ID=0)
     INNER JOIN OFFRE OFR ON LCT.OFR_ID=OFR.OFR_ID
    J'obtiens 15 secondes de temps d'exécution.
    J'ai vérifier que tous les indexes soient bien définis.
    La requête me retourne 1 seule ligne.
    Si j'enlève la condition LCT.CDE_ID=0 le temps est de <1s.
    De même si j'enlève la table des offres le temps est d'environ 2s.

    Qu'est qui ne va pas? Y-a-t-il un moyen de réduire ce temps de 15s?
    J'ai fait la requête sur firebird 1.5. (pas encore près pour la 2.1...)
    Vous trouverez le diagramme en pièce jointe.
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Et comme ça, en utilisant WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
      NO_Offre
    FROM
      BL_LIGNE BLL  
      INNER JOIN BL_ENTETE BLE ON BLE.LISTENOBL_ID = BLL.LISTENOBL_ID
      INNER JOIN LANCEMENT LCT ON  BLL.LCT_ID = LCT.LCT_ID
      INNER JOIN OFFRE OFR ON LCT.OFR_ID = OFR.OFR_ID
    WHERE
      BLE.CLIENT_ID = 433 AND
      LCT.ETAT_ID NOT IN (2, 5) AND 
      LCT.CDE_ID = 0
    Ensuite il serait peut-être intéressant de regarder le PLAN utilisé par cette requête.

    @+ Claudius

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    j'ai fait le test et ça fait toujours 15 secondes.
    Voici le plan :
    PLAN JOIN (LCT INDEX (FK_Lancement_6),OFR INDEX (RDB$PRIMARY1),BLE INDEX (FK_BL_ENTETE_3),BLL INDEX (RDB$FOREIGN105,RDB$FOREIGN11))

  4. #4
    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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    donnes la structure des tables avec leurs index et les plans de requêtes

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    Citation Envoyé par makowski Voir le message
    donnes la structure des tables avec leurs index et les plans de requêtes
    [QUOTE]
    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
    SET SQL DIALECT 3;
     
    CREATE DATABASE 'c:\Base\TEST'
    PAGE_SIZE 4096
    DEFAULT CHARACTER SET NONE;
     
    /* Table: BL_ENTETE, Owner: SYSDBA */
     
    CREATE TABLE "BL_ENTETE" 
    (
      "BLE_ID"	 INTEGER NOT NULL,
      "BLE_NO"	 VARCHAR(32),
      "CLT_ID"	 INTEGER NOT NULL,
    CONSTRAINT "PK_BL_ENTETE" PRIMARY KEY ("BLE_ID")
    );
     
    /* Table: BL_LIGNE, Owner: SYSDBA */
     
    CREATE TABLE "BL_LIGNE" 
    (
      "BLL_ID"	 INTEGER NOT NULL,
      "BLE_ID"	 INTEGER NOT NULL,
      "LCT_ID"	 INTEGER NOT NULL,
    CONSTRAINT "PK_BL_LIGNE" PRIMARY KEY ("BLL_ID")
    );
     
    /* Table: LANCEMENT, Owner: SYSDBA */
     
    CREATE TABLE "LANCEMENT" 
    (
      "LCT_ID"	 INTEGER NOT NULL,
      "OFR_ID"	 INTEGER NOT NULL,
      "CDE_ID"	 INTEGER NOT NULL,
      "ETAT_ID"	 INTEGER NOT NULL,
    CONSTRAINT "PK_LANCEMENT" PRIMARY KEY ("LCT_ID")
    );
     
    /* Table: OFFRE, Owner: SYSDBA */
     
    CREATE TABLE "OFFRE" 
    (
      "OFR_ID"	 INTEGER NOT NULL,
      "NO_OFFRE"	 VARCHAR(32) NOT NULL,
    CONSTRAINT "PK_OFFRE" PRIMARY KEY ("OFR_ID")
    );
     
    /*  Index definitions for all user tables */
     
    CREATE INDEX "IDX_LANCEMENT_1" ON "LANCEMENT"("CDE_ID");
    CREATE INDEX "IDX_LANCEMENT_2" ON "LANCEMENT"("ETAT_ID");
    ALTER TABLE "BL_LIGNE" ADD CONSTRAINT "FK_BL_LIGNE_1" FOREIGN KEY ("BLE_ID") REFERENCES "BL_ENTETE" ("BLE_ID") ON UPDATE CASCADE ON DELETE NO ACTION;
    ALTER TABLE "BL_LIGNE" ADD CONSTRAINT "FK_BL_LIGNE_2" FOREIGN KEY ("LCT_ID") REFERENCES "LANCEMENT" ("LCT_ID") ON UPDATE CASCADE ON DELETE NO ACTION;
    ALTER TABLE "LANCEMENT" ADD CONSTRAINT "FK_LANCEMENT_1" FOREIGN KEY ("OFR_ID") REFERENCES "OFFRE" ("OFR_ID") ON UPDATE CASCADE ON DELETE NO ACTION;
    ALTER TABLE "LANCEMENT" ADD CONSTRAINT "FK_LANCEMENT_2" FOREIGN KEY ("LCT_ID") REFERENCES "LANCEMENT" ("LCT_ID") ON UPDATE CASCADE ON DELETE NO ACTION;
    Voici le plan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PLAN JOIN (LCT INDEX (IDX_LANCEMENT_1),
     OFR INDEX (PK_OFFRE),
     BLL INDEX (FK_BL_LIGNE_1,FK_BL_LIGNE_2),
     BLE INDEX (PK_BL_ENTETE))

  6. #6
    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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    il faut rajouter des index
    le premier serait à priori sur la table LANCEMENT sur les champs (LCT_ID,CDE_ID)

    puis regarder les statistiques des requetes, le nombre de lecture faites

Discussions similaires

  1. Optimisation requête SQL
    Par ludo00002 dans le forum SQL
    Réponses: 2
    Dernier message: 06/10/2008, 09h01
  2. Comment optimiser requête SQL avec création Index
    Par schumi101 dans le forum SQL
    Réponses: 25
    Dernier message: 11/12/2007, 21h28
  3. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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