Bonjour,
J'essaie d'optimiser une requête SQL qui est passé de 15 minutes à plus de 150 minutes.
La requête update certains champs de la table T_CIBLE par les champs de la table T_SOURCE.
La table T_CIBLE contient 4 millions de lignes et est indexer sur les champs ID_1 et ID_2.
La table T_SOURCE 2 Millions de lignes.
le merge est le suivant :
Le plan d'exécution est celui ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 merge into T_CIBLE A using (select * from T_SOURCE WHERE CHAMPS_1='U') B on ( A.ID_1 = B.ID_1 and A.ID_1 = B.ID_1) when matched then update set A.CHAMPS_2 = B.CHAMPS_2, A.CHAMPS_3 = B.CHAMPS_3, A.CHAMPS_4 = B.CHAMPS_4, A.CHAMPS_5 = B.CHAMPS_5;
En forçant la lecture l'index de T_CIBLE, la requête mets toujours autant de temps mais l'explain plan semble beaucoup plus adéquat :
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 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------------------------------------- | 0 | MERGE STATEMENT | | 2536K| 2704M| 42188 | | | | | 1 | MERGE | T_CIBLE | | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10002 | 2536K| 1765M| 42188 | Q1,02 | P->S | QC (RAND) | | 4 | VIEW | | | | | Q1,02 | PCWP | | | 5 | HASH JOIN BUFFERED | | 2536K| 1765M| 42188 | Q1,02 | PCWP | | | 6 | BUFFER SORT | | | | | Q1,02 | PCWC | | | 7 | PX RECEIVE | | 2536K| 459M| 7779 | Q1,02 | PCWP | | | 8 | PX SEND HASH | :TQ10000 | 2536K| 459M| 7779 | | S->P | HASH | | 9 | TABLE ACCESS FULL| T_SOURCE | 2536K| 459M| 7779 | | | | | 10 | PX RECEIVE | | 4073K| 2097M| 12261 | Q1,02 | PCWP | | | 11 | PX SEND HASH | :TQ10001 | 4073K| 2097M| 12261 | Q1,01 | P->P | HASH | | 12 | PX BLOCK ITERATOR | | 4073K| 2097M| 12261 | Q1,01 | PCWC | | | 13 | TABLE ACCESS FULL| T_CIBLE | 4073K| 2097M| 12261 | Q1,01 | PCWP | | -----------------------------------------------------------------------------------------------------------
Auriez-vous une idée d'optimisation de cette requête ?
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 | ----------------------------------------------------------------------------------- | 0 | MERGE STATEMENT | | 2536K| 2704M| 3397K| | 1 | MERGE | TB_CUST | | | | | 2 | VIEW | | | | | | 3 | HASH JOIN | | 2536K| 1765M| 3397K| | 4 | TABLE ACCESS FULL | TI_BCCSTFIN_CUST | 2536K| 459M| 7779 | | 5 | TABLE ACCESS BY INDEX ROWID| TB_CUST | 4073K| 2097M| 3300K| | 6 | INDEX FULL SCAN | PK_TB_CUST | 4073K| | 4250 | -----------------------------------------------------------------------------------
Merci par avance !
Partager