Optimisation d'une requete MERGE via HINT d'index
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 :
Code:
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; |
Le plan d'exécution est celui ci :
Code:
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 | |
----------------------------------------------------------------------------------------------------------- |
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:
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 |
----------------------------------------------------------------------------------- |
Auriez-vous une idée d'optimisation de cette requête ?
Merci par avance !