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 39
Dec 282011
 

Kolegovi přišel požadavek na zjištění počtu transakcí, které probíhají nad tabulkou (potřeba vytvořit materializované view) od našich DBA. Trošku zváštní požadavek od DBA, nemyslíte? Proč by měli žádat vývojáře o tuto informaci, když si jí mohou zjistit sami? Nakonec se zjistilo, že DBA se původně ptali na to, jak velká bude submnožina v materializovaném view kvůli místu. Nechal jsem šéfa se zlobit, jak máme plnit požadavky, když námi přijmutý požadavek je úplně něco jiného než požadoval zadavatel a díval jsem z na to z pohledu programátora:

  • Počet transakcí nad tabulkou jde zjistit z Oracle Streams (pokud je to možné)
  • Z pohledu ALL_TAB_MODIFICATIONS

    SELECT INSERTS+UPDATES+DELETES FROM USER_TAB_MODIFICATIONS WHERE table_name='MY_TABLE';
    1271062015

    Co je podstatné, že ALL_TAB_MODIFICATIONS je definováno jako “last time statistics were gathered on the tables”. Tedy chce select ještě trošku učesat a zahrnout do něj ještě čas poslední analýzy tabulky:

    SELECT round(txs/(SELECT(SYSDATE-LAST_ANALYZED)*86400 FROM ALL_TABLES a WHERE a.TABLE_NAME=t.table_name and a.owner=t.table_owner),2) as "Tx/s" FROM(
    (SELECT SUM(INSERTS+UPDATES+DELETES) txs, MAX(table_name) table_name, MAX (table_owner) table_owner
    FROM ALL_TAB_MODIFICATIONS t WHERE t.table_name='MY_TABLE' and t.table_owner='AZOR')) t;


    Nevýhoda je zřejmá, od poslední analýzy mohlo uplynout spoustu hodin i dní a výsledek tedy neukazuje peak, který je nejzajímavější.
  • Pomocí Flashback version query
    Pokud je na to databáze správně nakonfigurovaná, pak je Flashback version query podle mne nejsilnější nástroj jak získat počet transakcí nad tabulkou, včetně rozpadnutí podle jednotlivých hodin.

    SELECT COUNT(*)/60 AS "Tx/s" FROM (
    SELECT id,versions_operation,rawtohex(versions_xid) xid, versions_starttime
    FROM MY_TABLE
    VERSIONS BETWEEN TIMESTAMP
    SYSTIMESTAMP - INTERVAL '60' MINUTE AND
    SYSTIMESTAMP
    WHERE versions_operation IS NOT NULL)


    Výhodou je možnost rozpadu po minutách/hodinách, vypsání pouze hodin v peaku, počet transakcí (nikoliv počet updatů/insertů)
  • Pomocí aplikační logiky  a Flashabacku – Siebel

    SELECT
    TO_NUMBER(SELECT SUM(MODIFICATION_NUM) FROM SIEBEL.S_ORDER)-
    (SELECT SUM(MODIFICATION_NUM) FROM SIEBEL.S_ORDER AS OF TIMESTAMP SYSDATE-1/24)
    FROM dual;

Způsobů by se asi dalo vymyslet více v závislosti na konfiguraci databáze nebo na úrovni aplikační logiky.

 Posted by at 23:02

 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>