sql >> Databáze >  >> RDS >> Oracle

Jak zkontrolovat zastaralé statistiky

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


  1. Určete pořadí na základě více sloupců v MySQL

  2. Instalace 32bitového klienta Oracle na Windows Server Již běží 64bitový databázový server Oracle

  3. Jak funguje justify_interval() v PostgreSQL

  4. Vložte data a nastavte cizí klíče pomocí Postgres