Oracle stale stats

select a.owner, a.table_name, m.partition_name
, inserts, updates, deletes, m.timestamp
, a.num_rows table_rows, p.num_rows partition_rows, a.last_analyzed
, case when nvl(p.num_rows,a.num_rows) = 0 then 0 else  round(nvl(inserts+ updates+ deletes,0)/nvl(p.num_rows,a.num_rows) *100) end  pct_stale 
, case when nvl(inserts+ updates+ deletes,0) > 1/dbms_stats.get_prefs('STALE_PERCENT') *nvl(p.num_rows,a.num_rows) then 'YES' else 'NO' end is_stale 
from all_tables a 
left outer join ALL_TAB_MODIFICATIONS m  on m.table_owner = a.owner and a.table_name = m.table_name
left outer join all_tab_partitions p on p.table_owner = a.owner and p.table_name = a.table_name and p.partition_name = m.partition_name 
where a.owner = '&OWNER.'; 


-- do tables have their own preferences?
select * from dba_tab_stat_prefs ;


-- the key defaults 

select dbms_stats.get_prefs('ESTIMATE_PERCENT') ESTIMATE_PERCENT
,  dbms_stats.get_prefs('STALE_PERCENT')  STALE_PERCENT 
,  dbms_stats.get_prefs('METHOD_OPT')  METHOD_OPT 
,  dbms_stats.get_prefs('GRANULARITY')  GRANULARITY 
,  dbms_stats.get_prefs('WAIT_TIME_TO_UPDATE_STATS') WAIT_TIME_TO_UPDATE_STATS 
from dual;


Comments