使用DBMS_STATS分析表

本文介绍了如何在使用DBMS_STATS分析表时保存并快速恢复系统性能,包括创建分析表、导出和导入表分析信息,以及分析索引和表信息的方法。通过实践示例,演示了如何高效地管理和优化数据库资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在使用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;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值