oracle 表分析

DBMS_STATS分析表与备份分析信息
2007-04-07 21:19

在使用DBMS_STATS分析表的时候,我们经常要保存之前的分析,以防分析后导致系统性能低下然后进行快速恢复。
首先创建一个分析表,该表是用来保存之前的分析值。
SQL> begin
   2   dbms_stats.create_stat_table(ownname => 'TEST',stattab => 'STAT_TABLE');
   3   end;
   4   /
PL/SQL 过程已成功完成。
分析表信息
SQL> BEGIN
   2   --DBMS_STATS.delete_table_stats(ownname => 'TEST',tabname => 'A');
   3   DBMS_STATS.gather_table_stats(ownname => 'TEST',tabname => 'A');
   4   END;
   5   /
PL/SQL 过程已成功完成。
导出表分析信息到stat_table中。
SQL> BEGIN
   2   dbms_stats.export_table_stats(ownname => 'TEST',tabname => 'A',stattab => 'STAT_TABLE');
   3   END;
   4   /
PL/SQL 过程已成功完成。
SQL>
同理也有
EXPORT_COLUMN_STATS:导出列的分析信息
EXPORT_INDEX_STATS:导出索引分析信息
EXPORT_SYSTEM_STATS:导出系统分析信息
EXPORT_TABLE_STATS:导出表分析信息
EXPORT_SCHEMA_STATS:导出方案分析信息
EXPORT_DATABASE_STATS:导出数据库分析信息
IMPORT_COLUMN_STATS:导入列分析信息
IMPORT_INDEX_STATS:导入索引分析信息
IMPORT_SYSTEM_STATS:导入系统分析信息
IMPORT_TABLE_STATS:导入表分析信息
IMPORT_SCHEMA_STATS:导入方案分析信息
IMPORT_DATABASE_STATS:导入数据库分析信息
GATHER_INDEX_STATS:分析索引信息
GATHER_TABLE_STATS:分析表信息,当cascade为true时,分析表、列(索引)信息
GATHER_SCHEMA_STATS:分析方案信息
GATHER_DATABASE_STATS:分析数据库信息
GATHER_SYSTEM_STATS:分析系统信息
SQL> select count(*) from stat_table;
   COUNT(*)
----------
          1
删除分析信息
SQL> BEGIN
   2   DBMS_STATS.delete_table_stats(ownname => 'TEST',tabname => 'A');
   3   END;
   4   /
PL/SQL 过程已成功完成。
导入分析信息
SQL> BEGIN
   2   DBMS_STATS.import_table_stats(ownname => 'TEST',tabname => 'A',stattab => 'STAT_TABLE');
   3   END;
   4   /
PL/SQL 过程已成功完成。
SQL>
示例:
--analyze.sql
set serveroutput on size 100000
declare
  v_per number(3);
  v_start number := dbms_utility.get_time;
  v_end   number;
begin
for rec in (select segment_name,segment_type,ceil(sum(bytes)/1024/1024) segment_size
  from user_segments group by segment_name,segment_type)
loop
    if rec.segment_type = 'INDEX' then
         dbms_stats.gather_index_stats(ownname=>'citictest',  --
自己改一下
                                       INDNAME=>rec.segment_name
                                      );
--        dbms_output.put_line(rec.segment_name||' '||rec.segment_size||'m '||ceil((dbms_utility.get_time - v_start)/100)||'s');
         v_start := dbms_utility.get_time;
    elsif rec.segment_type = 'TABLE' then
        case when rec.segment_size < 32 then
            v_per := 100;
             when rec.segment_size < 320 then
            v_per := 10;
        else
            v_per := 1;
        end case;
             dbms_stats.gather_table_stats(OWNNAME=>'citictest',
                   TABNAME=>rec.segment_name,
                   ESTIMATE_PERCENT=>v_per,
                   METHOD_OPT=>'FOR ALL INDEXED COLUMNS');
--         dbms_output.put_line(rec.segment_name||' '||rec.segment_size||'m '||ceil((dbms_utility.get_time - v_start)/100)||'s');
         v_start := dbms_utility.get_time;
    end if;
end loop;
end;
/                                       

你可能感兴趣的:(oracle,职场,dbms_stats,休闲)