Statistiky se mohou stát zastaralými, když se data v tabulce podstatně změní. Aktuální statistiky jsou důležité pro vytváření dobrých plánů provádění
Jak Oracle rozhodne, zda jsou statistiky zastaralé
Statistiky jsou považovány za zastaralé, když #(INSERTS + AKTUALIZACE + DELETE)>=10 % z NUM_ROWS z dba_tables:
Pro sledování změn tabulky je vyžadováno nastavení parametrů
Před verzí Oracle 10g bylo automatické shromažďování statistik pro objekty, které se staly zastaralými, řízeno nastavením příznaku MONITORING na tabulce.
V závislosti na příznaku MONITORING úloha GATHER_STATS_JOB shromáždila „GATHER EMPTY“ a „GATHER STALE“ na označených objektech.
Za 10 g jsou klíčová slova MONITORING a NOMONITORING zastaralá a budou ignorována. Funkce sledování tabulek je nyní řízena parametrem STATISTICS_LEVEL.
Když je STATISTICS_LEVEL nastavena na BASIC, monitorování je na tabulce zakázáno.
Když je STATISTICS_LEVEL nastaveno na TYPICAL, pak je monitorování povoleno.
Ve výchozím nastavení je STATISTICS_LEVEL nastaveno na TYPICAL a monitorování tabulek je povoleno. Důrazně se doporučuje nastavit STATISTICS_LEVEL na TYPICAL v 10g a více
Nastavením tohoto parametru Oracle sleduje přibližný počet operací INSERT, UPDATE a DELETE pro tabulku oracle od posledního shromáždění statistik. Tyto informace o „provedených změnách“ jsou uchovávány v SGA a SMON pravidelně (asi každých 15 minut) vyprázdní data do tabulek datového slovníku. Informace můžete ručně vyprázdnit voláním dbms_stats.FLUSH_DATABASE_MONITORING_INFO(). Informace z datového slovníku jsou viditelné prostřednictvím pohledů:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS a USER_TAB_MODIFICATIONS.
Oracle používá tato zobrazení k identifikaci tabulek, které mají zastaralé statistiky.
Kdykoli dojde k 10% změně dat v tabulce, Oracle považuje své statistiky za zastaralé.
Jak zkontrolovat zastaralé statistiky
Níže uvedený postup PLSQL zjistěte všechny tabulky ve schématu SCOTT, což jsou zastaralé statistiky
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT', objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Níže uvedený sql lze také použít ke zjištění insert,updates,deletes
select u.TIMESTAMP, t.last_analyzed, u.table_name, u.inserts, u.updates, u.deletes, d.num_rows, decode(d.num_rows,0,'Table Stats indicate No Rows', nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99') ,'Null Value in USER_TAB_MODIFICATIONS') ) percent from user_tables t,USER_TAB_MODIFICATIONS u,dba_tables d where u.table_name = t.table_name and d.table_name = t.table_name and d.owner = '&Owner' and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000) order by t.last_analyzed /
Pokud to chcete spustit na celé databázi
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Pokud chcete vidět tabulky, kde jsou statistiky prázdné, můžeme použít níže
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST EMPTY'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Nyní, jakmile najdete seznam tabulek, můžete pro tyto tabulky generovat statistiky.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Můžeme také spustit níže uvedený příkaz a vygenerovat statistiky pro všechny zastaralé objekty ve schématu
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Počínaje Oracle11g lze práh zastaralosti nastavit pomocí statistické předvolby STALE_PERCENT. To lze nastavit globálně pomocí DBMS_STATS.SET_GLOBAL_PREFS nebo na úrovni tabulky pomocí DBMS_STATS.SET_TABLE_PREFS.
Související články
ora-38029:statistiky objektů jsou uzamčeny
ora-20001 v Shromažďování statistik schématu na 11g(FND_HISTOGRAM_COLS)
Shromažďování statistik ve verzi 11i a R12
Přírůstkové shromažďování statistik v 11g
Jak na to nastavit Monitorování tabulek v Oracle a Relationship s STATISTICS_LEVEL