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
Jul 302015
 

Godiva, dnes jeden krátký tip – nedávno jsme objevil mě neznámou část příkazu ANALYZE TABLE, která umožní uložit ROWID chainovaných řádků – LIST CHAINED ROWS INTO. Takže si pojďme zkusit :) Pro spuštění tohoto příkazu existuje pouze jedna jediná pre-rekvizita a tou je mít tabulku do které se to uloží (alá constrain). Tabulka se dá získat spuštěním scriptů UTLCHAIN.SQL či UTLCHN1.SQL nebo stačí založit růčo se správnou strukturou, to jest:

CREATE TABLE CHAINED_ROWS (
owner_name varchar2(30),
table_name varchar2(30),
cluster_name varchar2(30),
partition_name varchar2(30),
subpartition_name varchar2(30),
head_rowid urowid,
analyze_timestamp date
);

A ted ještě jak to hezky nafixlovat, aby to bylo vidět – velikost bloku mam 8192 (8 kb), so udělejme 10 řádků po 790ti (overhead bloku by měl být daleko menší, ale nechme si raději buffer):

CREATE TABLE TST_CHAIN (
S_DATA VARCHAR2 (3000)
) PCTFREE 0;

INSERT INTO TST_CHAIN VALUES (RPAD('A',790,'A'));
INSERT INTO TST_CHAIN VALUES (RPAD('B',790,'B'));
INSERT INTO TST_CHAIN VALUES (RPAD('C',790,'C'));
INSERT INTO TST_CHAIN VALUES (RPAD('D',790,'D'));
INSERT INTO TST_CHAIN VALUES (RPAD('E',790,'E'));
INSERT INTO TST_CHAIN VALUES (RPAD('F',790,'F'));
INSERT INTO TST_CHAIN VALUES (RPAD('G',790,'G'));
INSERT INTO TST_CHAIN VALUES (RPAD('H',790,'H'));
INSERT INTO TST_CHAIN VALUES (RPAD('I',790,'I'));
INSERT INTO TST_CHAIN VALUES (RPAD('J',790,'J'));
commit;

Zanalyzujme:

ANALYZE TABLE TST_CHAIN compute statistics;

Fajn a nyní update nějakého řádku tak, aby se nevešel do datového bloku. Dejme mu třebas 3000x písmeno ‘X’, tedy 9*790+300=10110 a to se zajisté již do bloku 8kb nevejde. So, update náhodného řádku:

UPDATE TST_CHAIN SET s_data=RPAD('X',3000,'X') 
WHERE instr(s_data,chr(ascii('A')+MOD(abs(dbms_random.random),10)))<>0;
commit;

Zanalyzujeme:

ANALYZE TABLE TST_CHAIN compute statistics;

Naprosto dle očekávání trhu 2 datové bloky – jeden původní s daty a druhý, který vznikl updatem náhodného řádku – a jeden zřetězený rádek. A nyní konečně ke zkoušené klauzuli:

ANALYZE TABLE TST_CHAIN LIST CHAINED ROWS INTO CHAINED_ROWS;

Když mrknu na vrácené rowid (AAAHQWAABAAAN6RAAH), tak mi LIST CHAINED ROWS INTO tvrdí, že jsem updatoval řádek, který je 7 v pořadí:

Což je řádek, kdy byla původně H a krásně to koresponduje s posledním písmenem rowid :-) A nyní poslední krok, jen ověření, že to opravdu byl řádek s ‘H’áčkama:

Fajn, řádek s H chybí a místo něho je poslední řádek s Xkama  :)  So, enjoy LIST CHAINED ROWS INTO. Mimochodem v dokumentaci je uvedeno, že daný příkaz funguje jen pro fanoušky metalu.. ale možná teď tak trošku kecám ;)

 Posted by at 21:12

 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>