Bonjour,

J'ai 2 tables, dont une assez conséquente:

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
CREATE TABLE FUSASS 
(NODOSSIER NUMBER(10), 
CDCAISSE  CHAR(2), 
NOASS CHAR(6), 
CDCAISSENEW CHAR(2), 
NOASSNEW  CHAR(6))  ;
 
-- 71'503 lignes
 
CREATE TABLE GFUCVTP
(TXCPTNOM CHAR(10), 
CDOLDCAI    CHAR(2), 
NBOLDVAL NUMBER, 
CDNEWCAI CHAR(2), 
NBNEWVAL    NUMBER, 
CDAMIGRE CHAR(1))
 
-- 633'501 lignes
J'y ai lancé un update massif, mais Oracle ne m'a jamais rendu la main

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
update FUSASS a set a.noAssNew =
	(select b.nbnewval
	 from GFUCVTP b 
	 where a.cdCaisse = b.cdoldcai
    and  a.noAss = to_char(b.nboldval)
    and  b.txcptnom = 'MACLE'
	)
Si par conter je lance le select correspondant, la requête se fait tout de suite, et me retourne quelques 60'000 lignes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SELECT a.noAssNew ,  b.nbnewval
FROM  FUSASS a, GFUCVTP b
where a.cdCaisse = b.cdoldcai
and  a.noAss = to_char(b.nboldval)
and  b.txcptnom = 'MACLE'
Le plan d'exécution me retourne ces infos :

Etapes du plan d'exécution:

Etape n° Nom de l'étape
5 UPDATE STATEMENT
2 UPDATE
1 FUSASS TABLE ACCESS [FULL]
4 GFUCVTP TABLE ACCESS [BY INDEX ROWID]
3 FC_GFUCVTP INDEX [RANGE SCAN]

Etape n° Description Coût estimé Nombre estimé de lignes renvoyées Nombre estimé de kilo-octets renvoyés
1 Cette étape du plan extrait toutes les lignes de la table FUSASS. 81 71'503 1'256.889
2 Cette étape du plan met à jour les lignes de la table FUSASS qui remplissent la clause WHERE de l'instruction UPDATE.
3 Cette étape du plan extrait plusieurs ROWID par ordre croissant en balayant l'index B*-tree FC_GFUCVTP. 5 1 --
4 Cette étape du plan extrait des lignes de la table GFUCVTP via les ROWID renvoyés par un index. 33 1 0.025
5 Cette étape du plan définit cette instruction comme instruction UPDATE. 81 71'503 1'256.889
Comment expliquer ces lenteurs sachant qu'aucun fichier n'est saturé et que l'instance est de plus en noarchivelogs ?

Sous Oracle, n'y a-t-il pas moyen d'écrire l'update de manière plus conviviale, du genre

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
UPDATE FUSASS 
set a.noAssNew =  b.nbnewval
FROM  FUSASS a, GFUCVTP b
where a.cdCaisse = b.cdoldcai
and  a.noAss = to_char(b.nboldval)
and  b.txcptnom = 'MACLE'