-- AWR Table partitions with STALE/MISSING stats select STALE_STATS, last_analyzed, 'exec dbms_stats.gather_table_stats(''' || owner || ''',''' || table_name || ''',partname=>''' || partition_name|| ''',GRANULARITY=>''PARTITION'',DEGREE=>16,CASCADE =>TRUE);' from DBA_TAB_STATISTICS where owner = 'SYS' and table_name like 'WRH$%' and (STALE_STATS = 'YES' OR last_analyzed is null) and partition_name is not null ORDER BY owner, table_name, partition_name ; -- AWR Table with STALE/MISSING stats select STALE_STATS, last_analyzed, 'exec dbms_stats.gather_table_stats(''' || owner || ''',''' || table_name || ''',DEGREE=>16,CASCADE =>TRUE);' from DBA_TAB_STATISTICS where owner = 'SYS' and table_name like 'WRH$%' and (STALE_STATS = 'YES' OR last_analyzed is null) and partition_name is null order by num_rows asc ; -- Gather Fixed Object Stats ( Dynamic performance tables, eg. X$ table which are referenced in GV$ views) BEGIN dbms_stats.gather_fixed_objects_stats( no_invalidate => dbms_stats.auto_invalidate); END; / -- Gather dictionary stats BEGIN dbms_stats.gather_dictionary_stats(estimate_percent => dbms_stats.auto_sample_size , block_sample => false , method_opt => 'FOR ALL COLUMNS SIZE AUTO' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER EMPTY' , no_invalidate => dbms_stats.auto_invalidate ); END; / BEGIN dbms_stats.gather_dictionary_stats(comp_id => -- select comp_id from dba_registry order by comp_id; , estimate_percent => dbms_stats.auto_sample_size , block_sample => false , method_opt => 'FOR ALL COLUMNS SIZE AUTO' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER EMPTY' , no_invalidate => dbms_stats.auto_invalidate ); END; / BEGIN dbms_stats.gather_database_stats(estimate_percent => dbms_stats.auto_sample_size , block_sample => false , method_opt => 'FOR ALL COLUMNS SIZE 1' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER EMPTY' , gather_sys => TRUE , no_invalidate => dbms_stats.auto_invalidate ); dbms_stats.gather_database_stats(estimate_percent => dbms_stats.auto_sample_size , block_sample => false , method_opt => 'FOR ALL COLUMNS SIZE 1' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER STALE' , gather_sys => TRUE , no_invalidate => dbms_stats.auto_invalidate ); END; / BEGIN dbms_stats.gather_schema_stats(ownname => 'MUREX_MX_OWNER' , block_sample => false , estimate_percent => dbms_stats.auto_sample_size , method_opt => 'FOR ALL COLUMNS SIZE 1' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER EMPTY' , no_invalidate => dbms_stats.auto_invalidate , force => false ); dbms_stats.gather_schema_stats(ownname => 'MUREX_MX_OWNER' , block_sample => false , estimate_percent => dbms_stats.auto_sample_size , method_opt => 'FOR ALL COLUMNS SIZE 1' , degree => dbms_stats.auto_degree , granularity => 'AUTO' , cascade => dbms_stats.auto_cascade , options => 'GATHER STALE' , no_invalidate => dbms_stats.auto_invalidate , force => false ); END; / --**************************** -- Gather Stale Table stats --**************************** set serveroutput on size unlimited BEGIN FOR i in ( select owner, table_name , 'BEGIN dbms_stats.gather_table_stats(force=>false' || ',ownname=>''' || owner || '''' || ',tabname=>''' || table_name || '''' || NVL2(partition_name,',partname=>''' || partition_name || '''' ,'') || ',degree=>8' || ',granularity =>''PARTITION''' || ',no_invalidate => dbms_stats.auto_invalidate' || '); END;' sqltext from dba_tab_statistics s where 1=1 and owner LIKE 'TRAF_%' and STALE_STATS = 'YES' and STATTYPE_LOCKED IS NULL ) LOOP dbms_output.put_line(i.sqltext); execute immediate i.sqltext; END LOOP; END; / --**************************** -- Gather Stale Index stats --**************************** set serveroutput on size unlimited BEGIN FOR i in ( select owner, index_name, table_owner, table_name, partition_name , 'BEGIN dbms_stats.gather_index_stats(force=>false' || ',ownname=>''' || owner || '''' || ',indname=>''' || index_name || '''' || NVL2(partition_name,',partname=>''' || partition_name || '''' ,'') || ',degree=>8' || ',granularity =>''PARTITION''' || ',no_invalidate => dbms_stats.auto_invalidate' || '); END;' sqltext from dba_ind_statistics i where 1=1 and owner LIKE 'TRAF_%' and STALE_STATS = 'YES' and STATTYPE_LOCKED IS NULL ) LOOP dbms_output.put_line(i.sqltext); execute immediate i.sqltext; END LOOP; END; / exec DBMS_STATS.GATHER_DATABASE_STATS( METHOD_OPT => 'FOR ALL COLUMNS SIZE 1' , ESTIMATE_PERCENT => 5, DEGREE => 16, OPTIONS => 'GATHER EMPTY' , CASCADE => TRUE ); exec DBMS_STATS.GATHER_SCHEMA_STATS( ownname => 'schemaname', METHOD_OPT => 'FOR ALL COLUMNS SIZE 1' , ESTIMATE_PERCENT => 5, DEGREE => 16 , OPTIONS => 'GATHER EMPTY' , CASCADE => TRUE ); exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'HISTORY_OWN', tabname => 'PROVIDER_PRICE' , partname => 'PROVIDER_PRICE_2012_01', METHOD_OPT => 'FOR ALL COLUMNS SIZE 1' , ESTIMATE_PERCENT => 5 , DEGREE => 8 , CASCADE => TRUE ); exec DBMS_STATS.GATHER_INDEX_STATS(ownname => 'PM_OWN', indname => 'PMA_A_IDX1' , partname => 'PMA_A_0117_2013', ESTIMATE_PERCENT => 5 , DEGREE => 8 ); --**************************** -- List objects without stats --**************************** set serveroutput on DECLARE objlist DBMS_STATS.OBJECTTAB ; BEGIN DBMS_STATS.GATHER_DATABASE_STATS( METHOD_OPT => 'FOR ALL COLUMNS SIZE 1' , ESTIMATE_PERCENT => 5, DEGREE => 16, OPTIONS => 'LIST EMPTY' , objlist => objlist, CASCADE => TRUE ); for i in 1 .. objlist.COUNT LOOP dbms_output.put_line (objlist(i).objname); END LOOP; END; / --**************************** -- Incremental Stats --**************************** -- Enable exec dbms_stats.set_database_prefs( pname => 'INCREMENTAL' , pvalue = 'TRUE', add_sys => 'TRUE'); exec dbms_stats.set_schema_prefs( ownname => 'schemaname', pname => 'INCREMENTAL' , pvalue => 'TRUE'); exec dbms_stats.set_table_prefs( ownname => 'schemaname', tabname => 'tablename', pname => 'INCREMENTAL' , pvalue => 'TRUE'); -- Disable exec dbms_stats.set_database_prefs( pname => 'INCREMENTAL' , pvalue = 'FALSE', add_sys => 'TRUE'); exec dbms_stats.set_schema_prefs( ownname => 'schemaname', pname => 'INCREMENTAL' , pvalue => 'FALSE'); exec dbms_stats.set_table_prefs( ownname => 'schemaname', tabname => 'tablename', pname => 'INCREMENTAL' , pvalue => 'FALSE'); -- Disable Table Level BEGIN FOR i in (select * from dba_tab_stat_prefs where preference_name = 'INCREMENTAL' and preference_value = 'TRUE') LOOP dbms_stats.set_table_prefs( ownname => i.owner, tabname => i.table_name, pname => 'INCREMENTAL' , pvalue => 'FALSE'); END LOOP; END; / --**************************** -- Lock Stats --**************************** -- Lock table stats to skip daily gather stats BEGIN dbms_stats.lock_table_stats('PM_OWN', 'SEC_RISK_MEASURES_HIST'); END ; / -- Unlock table stats to include daily gather stats BEGIN dbms_stats.unlock_table_stats('PM_OWN', 'SEC_RISK_MEASURES_HIST'); END ; / -- How to find out tables with locked stats SELECT DISTINCT OWNER, TABLE_NAME, STATTYPE_LOCKED --, S.LAST_ANALYZED FROM DBA_TAB_STATISTICS S WHERE STATTYPE_LOCKED IS NOT NULL AND OWNER NOT IN ('SYS','SYSTEM','SYSMAN','WMSYS','SQLTXPLAIN') ORDER BY OWNER, TABLE_NAME ;