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 :

Problème optimisation requête


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut Problème optimisation requête
    Bonjour, voici 2 tables créées sous firebird 2.1:
    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
     
     
    /* Table: TABLE1, Owner: ADMIN1 (15000 enregistrements)*/
     
    CREATE TABLE "TABLE1" 
    (
      "ID"	 INTEGER NOT NULL,
      "CHAMP1"	 VARCHAR(32),
      "TABLE2_ID"	 INTEGER NOT NULL,
      "REF_REMPLACEMENT"	 VARCHAR(10000), /*Non contient pas de données*/
    CONSTRAINT "PK_TABLE1" PRIMARY KEY ("ID")
    );
     
    /*  Index definitions for TABLE1 */
     
    CREATE INDEX "IDX_TABLE1_1" ON "TABLE1"("CHAMP1");
    ALTER TABLE "TABLE1" ADD CONSTRAINT "FK_TABLE1_1" FOREIGN KEY ("TABLE2_ID") REFERENCES "TABLE2" ("ID") ON UPDATE CASCADE ON DELETE NO ACTION;
     
     
    /* Table: TABLE2, Owner: ADMIN1 (5 enregistrements)*/
     
    CREATE TABLE "TABLE2" 
    (
      "ID"	 INTEGER NOT NULL,
      "CHAMP2"	 VARCHAR(32),
    CONSTRAINT "PK_TABLE2" PRIMARY KEY ("ID")
    );
     
    /*  Index definitions for TABLE2 */
     
    CREATE INDEX "IDX_TABLE2_1" ON "TABLE2"("CHAMP2");
    Voici le script de génération de données:

    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
    COMMIT WORK;
    SET AUTODDL OFF;
    SET TERM ^ ;
     
    /* Stored procedures */
     
    CREATE PROCEDURE "SP_GEN_DATA" 
    AS
    BEGIN EXIT; END ^
     
     
    ALTER PROCEDURE "SP_GEN_DATA" 
    AS
    declare i integer;
    declare j integer;
    begin
     i=0;
     j=0;
     while(i<=15000)do
     begin
      while(j<=4) do
      begin
         j=j+1;
       insert into table2 values (:j,'TBL'||:j);
     
      end
      insert into Table1 values (:i,'VAL'||:i,:j);
     
       i=i+1;
     end
    end
     ^
     
    SET TERM ; ^
    COMMIT WORK;
    SET AUTODDL ON;

    Je fais les requêtes suivantes :
    1ère requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Champ1,REF_REMPLACEMENT,Table2.Champ2
    from Table1 inner join Table2 on Table2_ID=Table2.ID
    order by Champ1
    PLAN: PLAN JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1))
    Temps : 6s

    2ème requête sans le champ REF_REMPLACEMENT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Champ1,Table2.Champ2
    from Table1 inner join Table2 on Table2_ID=Table2.ID
    order by Champ1
    Plan : PLAN SORT (JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1)))
    Temps :0,0062s

    3ème requête sans le tri par champ1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select Champ1,REF_REMPLACEMENT,Table2.Champ2
    from Table1 inner join Table2 on Table2_ID=Table2.ID
    Plan: PLAN JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1))

    Temps:0,0031s

    J'ai réduit le champ REF_REMPLACEMENT à 255 et le temps d'exécution de la requête N°1 est devenu "normal".
    Comment expliquer le temps de la requête N°1?

  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 : 60
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH A (Champ1,Champ2,ID) AS 
    (SELECT Table1.Champ1, Table2.Champ2, Table1.ID
    FROM Table1 INNER JOIN Table2 ON Table1.Table2_ID=Table2.ID
    ORDER BY Table1.Champ1)
    SELECT A.Champ1, Table1.REF_REMPLACEMENT,A.champ2
    FROM A JOIN Table1 ON Table1.ID=A.ID
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Merci makowski,
    apparemment ça fonctionne, même si je ne comprends pas trop pourquoi...

Discussions similaires

  1. Problème optimisation requête
    Par moukat dans le forum Requêtes
    Réponses: 11
    Dernier message: 18/02/2014, 19h34
  2. Problème de requête pas optimisée
    Par AlternantOracle dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/01/2012, 12h52
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 17h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 15h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 19h02

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