Problème optimisation requête
Bonjour, voici 2 tables créées sous firebird 2.1:
Code:
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:
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:
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:
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:
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?