27 Mart 2008 Perşembe

FORALL Performance

FORALL
Örnek olarak bir tablodan çektiğimiz verilerle başka bir tabloyu doldurmamız gerekiyor. Yapacağımız iş nedir? Her select işlemi ile aldığımız veriyi insert ile tabloya eklemek veya bulk collect ile bir arraya veriyi atayıp daha sonra o array içerisinde FOR ile dönerek tabloya verileri ekleyebiliriz.
Bize bu konuda yardımcı olacak başka bir yapı var: FORALL. FORALL keywordu, Toplu DML Statementlerde performans artışı sağlayan çok önemli bir keyword. Somut bir örnekle FORALL’ın performansını gösterelim.
Step_1 : FORALL keywordlu procedure

create or replace procedure step_1 is
TYPE array_type_id IS TABLE OF TEST_1.ID%TYPE;
TYPE array_type_name IS TABLE OF TEST_1.NAME%TYPE;

iteration_time INTEGER := 1000;
varIdArr array_type_id := array_type_id();
varNameArr array_type_name := array_type_name();

BEGIN
SELECT ID,NAME BULK COLLECT INTO varIdArr,varNameArr FROM TEST_1;
FORALL i in varIdArr.first..varIdArr.last
INSERT INTO TEST_2 VALUES(varIdArr(i),varNameArr(i));
end;


Step_2: FOR keywordlu procedure

create or replace procedure step_2 is
TYPE array_type_id IS TABLE OF TEST_1.ID%TYPE;
TYPE array_type_name IS TABLE OF TEST_1.NAME%TYPE;

iteration_time INTEGER := 1000;
varIdArr array_type_id := array_type_id();
varNameArr array_type_name := array_type_name();

BEGIN
SELECT ID,NAME BULK COLLECT INTO varIdArr,varNameArr FROM TEST_1;
FOR i in varIdArr.first..varIdArr.last
LOOP
INSERT INTO TEST_2 VALUES(varIdArr(i),varNameArr(i));
END LOOP;
end;


Test Sonuçları:

SQL> exec runstats_pkg.rs_stop;

Run1 ran in 9 hsecs
Run2 ran in 125 hsecs
run 1 ran in 7,2% of the time

Name Run1 Run2 Diff
LATCH.dml lock allocation 1 0 -1
STAT...calls to get snapshot s 10 9 -1
LATCH.list of block allocation 0 1 1
STAT...IMU Flushes 1 0 -1
STAT...session cursor cache co 1 0 -1
LATCH.Consistent RBA 1 2 1
LATCH.lgwr LWN SCN 1 2 1
LATCH.mostly latch-free SCN 1 2 1
LATCH.OS process allocation 0 1 1
LATCH.enqueue hash chains 1 2 1
STAT...bytes received via SQL* 1,912 1,910 -2
STAT...messages sent 0 2 2
LATCH.library cache lock 2 4 2
LATCH.enqueues 0 2 2
STAT...enqueue requests 2 0 -2
LATCH.undo global data 24 28 4
STAT...consistent changes 14 19 5
LATCH.redo writing 3 8 5
STAT...cleanout - number of kt 22 28 6
STAT...active txn count during 22 28 6
STAT...calls to kcmgcs 22 28 6
STAT...consistent gets - exami 22 28 6
STAT...consistent gets 847 838 -9
STAT...consistent gets from ca 847 838 -9
LATCH.messages 2 14 12
LATCH.channel operations paren 0 14 14
LATCH.checkpoint queue latch 0 16 16
STAT...redo ordering marks 0 26 26
STAT...calls to kcmgas 0 26 26
STAT...workarea memory allocat -49 0 49
LATCH.SQL memory manager worka 6 73 67
STAT...change write time 3 78 75
STAT...free buffer requested 4 81 77
LATCH.cache buffers lru chain 4 81 77
STAT...recursive cpu usage 6 112 106
STAT...CPU used when call star 6 117 111
STAT...CPU used by this sessio 6 117 111
STAT...DB time 10 124 114
STAT...Elapsed Time 12 127 115
LATCH.object queue header oper 12 243 231
LATCH.simulator lru latch 56 877 821
LATCH.simulator hash latch 59 889 830
STAT...redo entries 87 10,036 9,949
LATCH.redo allocation 91 10,040 9,949
STAT...recursive calls 3 10,007 10,004
STAT...execute count 11 10,015 10,004
STAT...session logical reads 968 11,070 10,102
STAT...db block gets from cach 121 10,232 10,111
STAT...db block gets 121 10,232 10,111
STAT...db block changes 185 20,163 19,978
LATCH.library cache pin 60 20,068 20,008
LATCH.library cache 75 20,083 20,008
LATCH.cache buffers chains 2,238 52,343 50,105
STAT...undo change vector size 25,852 642,176 616,324
STAT...redo size 209,100 2,471,572 2,262,472

Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
2,691 104,847 102,156 2.57%

PL/SQL procedure successfully completed

SQL>
Görüldüğü gibi FORALL’ı kullandığımız zaman 9hsec’te gerçekleşen iş, bu keywordu kullanmadığımız zaman 125hsec süre içersinde gerçekleşmiş. Ayrıca LATCH oranlarını karşılaştırdığımızda da 1/50 gibi bir oran karşımıza çıkıyor. Ve bu istatistikler bize FORALL’ın Toplu DML İşlemlerinde (INSERT,DELETE,UPDATE) ne kadar önemli bilgi sağladığını göstermiş oluyor.

Hiç yorum yok:

Yorum Gönder