Bonjour,

si je me permets de poster ici, c'est que je suis vraiment dans la .
J'essaye d'optimiser des requêtes qui portent sur des millions de lignes, depuis quelques temps, mais c'est encore beaucoup trop lent.
Alors j’espère que vous pourrez me donner quelques pistes.


voilà un exemple de requête et son plan d’exécution :

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
55
56
57
 
select   CHAMP1,count(*) cpt   
from TABLE1   
where (CHAMP1='XXXXX'  or CHAMP1='YYYYY')  
and TABLE1.CHAMP2 in (select CHAMP2 from TABLE3 where table3ID=1) 
and TABLE1.CHAMP3 in ( select CHAMP3  from TABLE4 where table4ID=1)         	
and  CHAMP5   in 
	(                    
	select    CHAMP5                    
	from TABLE2                     
	where  CHAMP6 =                                  
			(                                  
			select max(CHAMP6)                                   
			from TABLE2 m2                                  
			where TABLE2.CHAMP5=CHAMP5                               
			)                    
	and TABLE2.CHAMP1 = 'ZZZZZZ'                        
	group by CHAMP5                       
	)     
group by CHAMP1;
 
 
select plan_table_output from table(dbms_xplan.display());
 
 
---------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                     |     1 |    36 |       | 20596   (3)| 00:04:08 |
|   1 |  HASH GROUP BY                  |                     |     1 |    36 |       | 20596   (3)| 00:04:08 |
|   2 |   NESTED LOOPS                  |                     |     1 |    36 |       | 20595   (3)| 00:04:08 |
|   3 |    NESTED LOOPS                 |                     |     1 |    31 |       | 20595   (3)| 00:04:08 |
|   4 |     NESTED LOOPS                |                     |     2 |    50 |       | 20595   (3)| 00:04:08 |
|   5 |      VIEW                       | VW_NSO_2            |     2 |    10 |       | 20591   (3)| 00:04:08 |
|   6 |       HASH GROUP BY             |                     |     2 |    10 |       | 20591   (3)| 00:04:08 |
|   7 |        VIEW                     | VM_NWVW_3           |     2 |    10 |       | 20591   (3)| 00:04:08 |
|*  8 |         FILTER                  |                     |       |       |       |            |          |
|   9 |          HASH GROUP BY          |                     |     2 |    84 |       | 20591   (3)| 00:04:08 |
|* 10 |           HASH JOIN             |                     |  4090K|   163M|    14M| 20305   (2)| 00:04:04 |
|* 11 |            TABLE ACCESS FULL    | TABLE2              |   350K|    10M|       | 12948   (1)| 00:02:36 |
|  12 |            INDEX FAST FULL SCAN | IDX_MAX_CHAMP6      |  3548K|    37M|       |  2726   (2)| 00:00:33 |
|* 13 |      TABLE ACCESS BY INDEX ROWID| TABLE1              |     1 |    20 |       |     2   (0)| 00:00:01 |
|* 14 |       INDEX UNIQUE SCAN         | IDX8                |     1 |       |       |     1   (0)| 00:00:01 |
|* 15 |     INDEX UNIQUE SCAN           | IDX20               |     1 |     6 |       |     0   (0)| 00:00:01 |
|* 16 |    INDEX UNIQUE SCAN            | IDX23               |     1 |     5 |       |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   8 - filter("CHAMP6"=MAX("CHAMP6"))
  10 - access("TABLE2"."CHAMP5"="CHAMP5")
  11 - filter("TABLE2"."CHAMP1"='ZZZZZZ')
  13 - filter("TABLE1"."CHAMP2" IS NOT NULL AND ("CHAMP1"='XXXXX' OR "CHAMP1"='YYYYY'))
  14 - access("CHAMP5"="CHAMP5")
  15 - access("table3ID"=1 AND "TABLE1"."CHAMP2"="CHAMP2")
  16 - access("table4ID"=1 AND "TABLE1"."CHAMP3"="CHAMP3")

Peut être que c'est au niveau des requetes, des indexes, ou bien d'oracle lui même...
Je ne sais plus trop quoi faire pour optimiser cette requête.
Merci pour l'aide que vous pourrez m'apporter.