Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Dec 072011
 

Použiváte CACHE parametr při vytváření sekvence? Pokud zadáte místo defalutního NOCACHE hodnotu CACHE n Oracle automaticky načte poslední poslední použité číslo a reservuje pro sebe n hodnot, které může daný proces volně používat a z toho plyne i výkonová výhoda – vícenásobné použití sekvence bez nutnosti přistupovat často na medium. Logicky Oracle doporučuje používat vždy tuto hodnotu na RAC (Real Aplication Cluster), kde o může o blok soupeřit více procesů a kde je nutné pečlivě ladit výkon. Menší nevýhoda CACHE je, že i když dáte ORDER čísla budou sice stále zasebou, ale mohou mít mezi sebou mezery. A jak k tomuto tématu řiká Tomas Kyte “mezery nevadí”. Důvod mezer je právě funkcionalita kešování hodnot – Oracle si vymezí n hodnot a na mediu inkrementuje sekvenci o n hodnot. V paměti je pak hodnota inkremetována a až do dalšího zápisu při hodnodě n je držena pouze v paměti a není nikde zapisována. V případě výpadku instance, flush SGA apod pak dojde v “díře” mezi hodnotami.

Kdy používat CACHE? Při logovování, ve statistikách, v tabulkách kde je primarání klíč generování sekvencí ..

Kde nepoužívat? V místech, kde z pohledu výpočtu NESMÍ být mezery a nebo v tabulkách tybu konfiguračních, kde je pár stovek/tisíc záznamů a kde neřešíme výkon ale raději dáme přednost koukání na hezky čísla za sebou ;)

Na co pozor? MAXVALUE musí být nyní počet_chtěných hodnot krát velikost CACHE.

I když použití CACHE parametru se hodí na zatížený systém, lze si benefit této featury vyzkoušet i na instanci Oracle, která není pod žádným zatížením :

  • Nejprve vytvoříme testovací sekvence – 2 na 20 je asi 1 milion a tedy vytvoříme 24 sekvencí (NOCACHE+23 krát budeme násobit velikost CACHE parametru)

1) SEQUENCE bez CACHE:
CREATE SEQUENCE SEQ_NOCACHE MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE;
sequence SEQ_NOCACHE created.
Elapsed: 00:00:00.140

2) SEQUENCE CACHE 20:
CREATE SEQUENCE SEQ_NOCACHE MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 ORDER NOCYCLE;
sequence SEQ_NOCACHE created.
Elapsed: 00:00:00.140

3) SEQUENCE CACHE 200:
CREATE SEQUENCE SEQ_NOCACHE MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH 1 CACHE 200 ORDER NOCYCLE;
sequence SEQ_NOCACHE created.
Elapsed: 00:00:00.140

4) SEQUENCE CACHE 20000:
CREATE SEQUENCE SEQ_NOCACHE MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH 1 CACHE 20000 ORDER NOCYCLE;
sequence SEQ_NOCACHE created.
Elapsed: 00:00:00.140

5) Kód k testování rychlosti:

DECLARE
n_test NUMBER;
BEGIN
FOR i IN 1..3999999 LOOP
n_test:=SEQ_NOCACHE.NEXTVAL;
END LOOP;
END;

Sekvence Cache Čas
SEQ_NOCACHE NOCACHE 00:14:38.891
SEQ_CACHE20 20 00:02:46.547
SEQ_CACHE200 200 00:02:10.532
SEQ_CACHE20000 20000 00:02:07.125

 

Všimnou je dobré si například toho, jak Oracle zachází sám s CACHE u systémových sekvencí – bez keše jsou sekvence pro HR schéma, konfigurace Oracle Streams a to je téměř vše u ostatních systémových sekvencí Oracle databáze CACHE má – od 2 (Logminer, Warehouse) až po 10000 (Advence Query)

 Posted by at 00:25

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>