Sequence Row cache lock incelemesi

Row cache lock inceleme:

Sistemde bir sequence den yapılan selectlerin çok uzun sürmeye başladığını gözlemledik. Bunun birden fazla nedeni olabilir.

 

Problem yaşadığımız sequence nocache bir sequence, cache miktarını arttırmanın problemimizi çözüp çözmeyeceğini incelemek  ve kök nedeni bulmak için aşağıdaki adımları gerçekleştirdim.

Öncelikle aşağıdaki sorgu ile shared pool boyutunun yeterli olup olmadığı incelenir.

select parameter ,
getmisses "MISS",
gets "READ",
100 - (100 * (sum(getmisses)/sum(gets))) "% Success"
from v$rowcache
where gets > 0 and
parameter = 'dc_sequences'
group by
parameter, getmisses , gets
order by 4 desc;

 

sorgu sonucunda miss oranımızın çok düşük olduğunu görüyoruz bu da bize shared pool size değerimizin yeterli olduğu fikrini veriyor.


Bundan sonra sequence’i cache leme işlemini deneyeceğiz.

Örnek sequence ve tablo oluşturdum.

CREATE TABLE TAHSINC.TEST_TABLE ( ID NUMBER(38));

CREATE SEQUENCE TAHSINC.TEST_SEQUENCE
 START WITH 1
 MAXVALUE 9999999999999999999999999999
 MINVALUE 1
 NOCYCLE
 NOCACHE
 NOORDER
/

Tabloyu doldurmak için. Aşağıdaki gibi bir loop yazıyoruz. Tek bir session açarak aşağıdaki sorguyu çalıştırıyoruz.

 

set lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

1.000.000 adet insert işlemimiz 5 dakika sürüyor.

Diagnostic destten trace dosyamızı buluyoruz. Set ettiğimiz trace identifier ile dosyayı kolayca buluyoruz

cd /u01/app/oracle/diag/rdbms/testdb/testdb2/trace/

trace dosyamızın ismi testdb2_ora_387821_SEQUENCE_TEST_SESSION.trc

Trace dosyamızı okunabilir hale getirmek için tkprof tool’unu kullanıyoruz.

tkprof testdb2_ora_387821_SEQUENCE_TEST_SESSION.trc translated.txt explain=tahsinc/your_password  table=sys.plan_table sys=no waits=yes

 

tkprof dosyasının içeriğine baktığımızda tek session üzerinden yapılan insert işlemlerinde bir row cache lock waiti olmadığını görüyoruz.

Bunun ardından üç ayrı sessiondan insert işlemini simultane olarak çalıştırmayı deniyoruz.

Sessionlardan sadece birini yine aşağıdaki gibi traceliyoruz.

lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION2";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

3 session olarak çalıştırdığımızda. Bir session ortalama 13 dakikada tamamlanıyor.

Yeni oluşan trace dosyamızı tkprof ile okunabilir hale getiriyoruz.

tkprof testdb2_ora_387821_SEQUENCE_TEST_SESSION2.trc translated.txt explain=tahsinc/your_password  table=sys.plan_table sys=no waits=yes

bir önceki denememizden farklı olarak işlem yoğunluğunun row cache lock üzerinde oluştuğunu görüyoruz. 6 dakikanun üzerinde beklemeye neden oluyor.


Şimdi aynı işlemi sequence cache miktarını arttırdıktan sonra deniyoruz.

Alter sequence TAHSINC.TEST_SEQUENCE cache 1000;

 

set lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION3";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

 

Cache miktarını 1000 olarak arttırdığımızda 1 dakika 20 saniyede işlem tamamlanıyor.

Trace dosyasını incelediğimizde. Cache miktarını arttırmamız 3 simultane bir milyonluk insert işlemindeki 380 saniyelik wait’ i 7 saniyeye düşürüyor.

 

Sonuç olarak düşük cache li ya da cache siz sequencelerinizde row cache lock wait görüyorsanız. Ve shared pool boyutunuz yeterliyse. sequence e cache ekleme ya da cache arttırma işlemi yapmanız performansınızı arttıracaktır.

 

Leave a Reply

Your email address will not be published. Required fields are marked *