Bonjour, voici 2 tables créées sous firebird 2.1:
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 /* 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");
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:
PLAN: PLAN JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1))
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
Temps : 6s
2ème requête sans le champ REF_REMPLACEMENT:
Plan : PLAN SORT (JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1)))
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
Temps :0,0062s
3ème requête sans le tri par champ1:
Plan: PLAN JOIN (TABLE2 NATURAL, TABLE1 INDEX (FK_TABLE1_1))
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
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?
Partager