Bonjour,
J'ai 2 tables, dont une assez conséquente:
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
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
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
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' )
Le plan d'exécution me retourne ces infos :
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'
Comment expliquer ces lenteurs sachant qu'aucun fichier n'est saturé et que l'instance est de plus en noarchivelogs ?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
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'
Partager