OK, alors voici un exemple tiré de notre DB de Prod.
Tu comprendras bien sûr que je ne peux pas donner la structure et les données ici...
Contexte des tables :
on va travailler sur un échantillon :Requester, équivalent à une table client
AdministrativeProcedure, le nom est évident, directement lié à Requester avec une FK
Une fonction pipelined qui ramènes le dernier élément d'un type donné de procédure administrative, par "Requester"GME@rasp> select count(*) from requester where Requester_i between 40000 and 45000 ;
COUNT(*)
----------
2454
Ecoulé : 00 :00 :00.01
/************************************/
GME@rasp> Select count(*) from AdministrativeProcedure where Requester_i between 40000 and 45000 ;
COUNT(*)
----------
44861
Ecoulé : 00 :00 :00.04
Une fois sans paramètre (jointure "après") et une fois avec un paramètre (jointure "avant").
sans paramètre :
et avec :
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 Function FGetLastTransferTab Return AdminProcTable Pipelined Is Cursor cTrsf is Select distinct A.Requester_i , A.T_ProcedureEvent_i , substr(Utility.FGetItemCode(A.T_ProcedureEvent_i),1,35) as Code , A.EventDate , A.Delay From AdministrativeProcedure A Where A.T_ProcedureEventClass_i = 581 And A.EventDate = ( Select max(A2.EventDate) From AdministrativeProcedure A2 Where A.Requester_i = A2.Requester_i And A2.T_ProcedureEventClass_i = 581 ) ; Begin For i in cTrsf Loop pipe row ( AdminProcType ( i.requester_i , i.T_ProcedureEvent_i , i.Code , i.EventDate , i.Delay ) ) ; End Loop ; Return ; End FGetLastTransferTab ;
exécution sur SQLPlus avec Set AutoTrace on, résultat toujours à la 2ème exécution, pour que les blocs soient bien au chaud dans le buffer ...
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Function FGetLastTransferTab ( pn_Requester_i IN Number ) Return AdminProcTable Pipelined Is Cursor cTrsf is Select distinct A.Requester_i , A.T_ProcedureEvent_i , substr(Utility.FGetItemCode(A.T_ProcedureEvent_i),1,35) as Code , A.EventDate , A.Delay From AdministrativeProcedure A Where A.T_ProcedureEventClass_i = 581 And A.EventDate = ( Select max(A2.EventDate) From AdministrativeProcedure A2 Where A.Requester_i = A2.Requester_i And A2.T_ProcedureEventClass_i = 581 ) And A.Requester_i = pn_Requester_i ; Begin For i in cTrsf Loop pipe row ( AdminProcType ( i.requester_i , i.T_ProcedureEvent_i , i.Code , i.EventDate , i.Delay ) ) ; End Loop ; Return ; End FGetLastTransferTab ;
sans paramètre :
et avec paramètre :
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Select R.Requester_i , T.* From Requester R , Table(Utility.FGetLastTransferTab) T Where R.Requester_i between 40000 and 45000 And R.Requester_i = T.Requester_i ; -- ici les données 2454 ligne(s) sélectionnée(s). Ecoulé : 00 :00 :18.44 Plan d'exécution ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=11 Card=2 Bytes=14) 1 0 NESTED LOOPS (Cost=11 Card=2 Bytes=14) 2 1 COLLECTION ITERATOR (PICKLER FETCH) OF 'FGETLASTTRANSFER TAB' 3 1 INDEX (UNIQUE SCAN) OF 'REQUESTER_PK1' (UNIQUE) Statistiques ---------------------------------------------------------- 61792 recursive calls 20 db block gets 102745 consistent gets 6540 physical reads 0 redo size 109136 bytes sent via SQL*Net to client 1420 bytes received via SQL*Net from client 330 SQL*Net roundtrips to/from client 0 sorts (memory) 2 sorts (disk) 2454 rows processed
résultat = 18 secondes sans paramètre et 6 secondes avec le paramètre...
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Select R.Requester_i , T.* From Requester R , Table(Utility.FGetLastTransferTab(R.Requester_i)) T Where R.Requester_i between 40000 and 45000 ; -- ici les données 2454 ligne(s) sélectionnée(s). Ecoulé : 00 :00 :06.46 Plan d'exécution ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=25823 Card=19168334 Bytes=134178338) 1 0 NESTED LOOPS (Cost=25823 Card=19168334 Bytes=134178338) 2 1 INDEX (RANGE SCAN) OF 'REQUESTER_PK1' (UNIQUE) (Cost=6 C ard=2347 Bytes=11735) 3 1 COLLECTION ITERATOR (PICKLER FETCH) OF 'FGETLASTTRANSFER TAB' Statistiques ---------------------------------------------------------- 9816 recursive calls 0 db block gets 31307 consistent gets 0 physical reads 0 redo size 109136 bytes sent via SQL*Net to client 1420 bytes received via SQL*Net from client 330 SQL*Net roundtrips to/from client 7362 sorts (memory) 0 sorts (disk) 2454 rows processed
Partager