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
May 252013
 

Dnes tip na jedno úžasné view o kterém zrovna dlouho nevím – V$SEGMENT_STATISTICS. Obecně v Oracle platí, že v tabulkách a pohledech lze nalézt téměř vše s menšíma výjimkami - například binding proměnnou v projection selectu jinak než trace eventem nedohledáme (na rozdíl od binding proměnných v predikátech), což nám třeba kdysi vadilo na Siebelu, kdy tagoval sql, které pral do databáze select xx ,’zde’ from yyy;  Ale zpět k pohledu V$SEGMENT_STATISTICS, jak název napovídá je tam statistika segmentů.

Dokuementace: http://docs.oracle.com/cd/E11882_01/server.112/e10820/dynviews_3003.htm

Takže nějaká ukázka:

create table segment_test as

select rpad('A'||ROWNUM||'A',500,ROWNUM) as col from dual connect by level<1000;

A rovnou pohled V$SEGMENT_STATISTICS:

Segment statistic

V$SEGMENT_STATISTICS

A nyní spočet statistik, jak naše tabulka vypadá (ok, jsem hulvát, ale dbms_stats.gather_table.. je strašně dlouhé ;)

analyze table SEGMENT_TEST compute statistics;

A při pohledu do all_tables je vidět, že tabulka má 72 datových bloků, což dává smysl.  To jsou statistiky, které vznikly při CTASu. Takže proč to nezkusit znovu:

sqlplus / as sysdba

shutdown immediate;

startup;

Nyní V$SEGMENT_STATISTICS pro novou tabulku nevrací nic (ani prázdné řádky s nulou). Takže znovu s tím nejjednodušším:

select * from segment_test where rowid='AAATAAAABAAAVFSAAF';

A nyní pohled v V$SEGMENT_STATISTICS:

V$SEGMENT_STATISTICS - po selectu přes ROWID

V$SEGMENT_STATISTICS - po selectu přes ROWID

Jeden přístup do segmentu, jedno čtení po selectu s jedním rowid v podmínce. Tedy funguje !

P.S. Při pohledu na mé rowid je asi jasné, že jsem doma trošku prase, ale psst ;)

 Posted by at 10:04
Aug 112011
 

Na zjištění nastavení kompilačních parametrů existuje tabulka: *_PLSQL_OBJECT_SETTINGS (tzn. USER_PLSQL_OBJECT_SETTINGS, ALL_PLSQL_OBJECT_SETTINGS a DBA_PLSQL_OBJECT_SETTINGS).


SELECT * FROM USER_PLSQL_OBJECT_SETTINGS;

A co, že je zde možné vyčíst?


DESC ALL_PLSQL_OBJECT_SETTINGS;

OWNER NOT NULL VARCHAR2(30)
NAME NOT NULL VARCHAR2(30)
TYPE VARCHAR2(12)
PLSQL_OPTIMIZE_LEVEL NUMBER
PLSQL_CODE_TYPE VARCHAR2(4000)
PLSQL_DEBUG VARCHAR2(4000)
PLSQL_WARNINGS VARCHAR2(4000)
NLS_LENGTH_SEMANTICS VARCHAR2(4000)
PLSQL_CCFLAGS VARCHAR2(4000)
PLSCOPE_SETTINGS VARCHAR2(4000)

 

 Posted by at 23:00
Apr 152011
 

Oracle poskytuje k kladění výkonu velice zajímavou tabulku ALL_TAB_MODIFICATIONS, ve které jsou odkady operací, které jsou prováděny nad tabulkou – INSERT,DELETE,UPDATE. Tahle tabulka pak může sloužit jednak jako kontrolní zda-li se v databázi nedějí nějaké nekalosti a druhak při optimalizaci počitání statistik, indexů a obecně k ladění výkonu.

SELECT * FROM ALL_TAB_MODIFICATIONS;

SELECT * FROM ALL_TAB_MODIFICATIONS WHERE TABLE_NAME='T_TX_BILLING;

Tada v tabulce pochopitelně z výkonových důvodů nejsou pravidelně aktualizována, ale jako odhad, jsou určitě postačující. Tabulku lze pak vyflushovat pomocí PL/SQL procedury DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;

 Posted by at 18:01
Apr 112011
 

Po spuštění (bohužel až po spuštění) dokáže Oracle odhadnout jak dlouho bude trvat daný SQL příkaz (upozorňuji, že pouze SQL u PL/SQL scriptu si to člověk musí odvodit většinou sám na základě zkušenosti, odhadu a odhadu vycházející z toho co to má dělat, příkladně na základě nějakého profileru apod.).

Pohled, který je pro zjištění odhadované doby trvání se jmenuje V$SESSION_LONGOPS, v tomto pohledu se objeví všechny dlouhotrvající operace (operace, která je dlouhotrvající je definována tak, že Oracle již interně považuje za rozumne chovat se k ní jinak a sledovat u ní více informací, protože poměr výpočet/overhead je již rozumný – dle dokumentace musí trvat operace  6 sekund a více, aby se objevila v tomto pohledu).

SELECT * FROM V$SESSION_LONGOPS;

Na databázi typicky běží více operací a proto je vhodné zjistit si SQL_ID, SQL_HASH_VALUE z některého z jiných pohledů, například V$SQL a V$SESSION a s danou tabulkou to spojit Případně pomocí SIDu.

Do pohledu V$SESSION_LONGOPS lze také přidat vlastní záznam o vlastní operaci o které víme, že poběží dlouho a to pomocí PL/SQL procedury DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS.

 Posted by at 18:19