2011. január 21., péntek

További gondolatok a szekvenca cache size beállításról.

Tovább kutakodtam a szekvencia cache méretezés témakörében. Az adattárház üzemeltetők részéről felmerült az aggodalom, hogy ha túl magas értékre állítom be a cache értéket az felemészti a memóriát. Kiderítettem, hogy ez az aggodalom alaptalan. Az Oracle support [ID 378302.1] bejegyzéséből megtudtam, hogy a memóriában csupán két szám tárolódik, a szekvencia aktuális értéke és egy high water mark érték, a cache konkrét méretétől függetlenül:

A fentieket alátámasztó idézetek az említett support bejegyzésből:
"a sequence is typically cached in memory as a last used value and a high water mark value"
"NOTE: increasing the cache size of a sequence does not waste space, the cache is still defined by just two numbers"

Készítettem egy teszt scriptet, amivel demonstrálni lehet a különböző beállításokhoz tartozó teljesítmény különbséget:


drop sequence test_seq;
drop table seq_test_table;

create sequence test_seq
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;

create table seq_test_table as
select /*+ seq_nocache */ test_seq.nextval val
from dba_objects
where rownum < 100000;

select s.DIRECT_WRITES, s.BUFFER_GETS, s.USER_IO_WAIT_TIME, s.CPU_TIME, s.ELAPSED_TIME
from v$sql s
where s.sql_text like ' create table seq_test_table as select /*+ seq_nocache */%';

drop sequence test_seq;
drop table seq_test_table;

create sequence test_seq
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 100000;

create table seq_test_table as
select /*+ seq_cache */test_seq.nextval val
from dba_objects
where rownum < 100000;

select s.DIRECT_WRITES, s.BUFFER_GETS, s.USER_IO_WAIT_TIME, s.CPU_TIME, s.ELAPSED_TIME
from v$sql s
where s.sql_text like ' create table seq_test_table as select /*+ seq_cache */%'; 


A fejlesztői rendszerünkben a fenti script nocache esetén 43 másodpercig futott, míg 100000 - es caceh esetén mindössze 2 másodpercig.

A fentiek alapján érdemes az alábbi lekérdezés eredményén elmeditálni egy kicsit:

select *
from dba_sequences s
where s.cache_size = 0

Nincsenek megjegyzések:

Megjegyzés küldése