Bonjour à tous,
J'ai la requête ci-dessous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select count(1) from table_1 a inner join table_2 b on a.ID = b.table_1_ID inner join table_3 c on a.ID = c.table_1_ID where ... ;Je voulais l'optimiser pour ne plus faire de Table Access full. J'ai donc changé la requête comme ci-dessous pour utiliser les index :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 24 | 29 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 24 | | | |* 2 | FILTER | | | | | | |* 3 | HASH JOIN OUTER | | 206 | 4944 | 29 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL| table_2 | 534 | 5340 | 4 (0)| 00:00:01 | | 5 | TABLE ACCESS FULL| table_3 | 1157 | 16198 | 25 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select /*+ INDEX(b table_2_IX) INDEX(c table_3_IX) */ count(1) from table_1 a inner join table_2 b on a.ID = b.table_1_ID inner join table_3 c on a.ID = c.table_1_ID where ... ;Je me retrouve donc a faire un INDEX FULL SCAN ce qui est beaucoup plus long que la lecture complète des tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 ------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 24 | 1387 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 24 | | | |* 2 | HASH JOIN | | 206 | 4944 | 1387 (0)| 00:00:01 | |* 3 | TABLE ACCESS BY INDEX ROWID BATCHED| table_2 | 534 | 5340 | 541 (0)| 00:00:01 | | 4 | INDEX FULL SCAN | table_2_IX | 1079 | | 4 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID BATCHED| table_3 | 1157 | 16198 | 846 (0)| 00:00:01 | |* 6 | INDEX FULL SCAN | table_3_IX | 1157 | | 5 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------------------------
Auriez-vous des idées pour m'aider à optimiser cette requête ? Me dire ce que vous en pensez et si vous trouvez ça normal.
Merci d'avance pour votre aide.
Cordialement,
Partager