您的位置:首页 > 数据库

使用DBMS_STATS分析表

2012-02-10 10:54 337 查看
 
在使用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;

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息