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 : 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;
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
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 : 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 |
-----------------------------------------------------------------------------------
Auriez-vous une idée d'optimisation de cette requête ?

Merci par avance !