使用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;
/
相关文章推荐
- 如何使用dbms_stats分析统计信息
- 如何使用dbms_stats分析统计信息?
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用
- 使用pgstatspack分析PostgreSQL数据库性能
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用
- 使用DBMS_STATS重放性能问题
- ORACLE 中dbms_stats分析表
- Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例
- ORACLE 中dbms_stats的使用
- ORACLE 中dbms_stats的使用
- dbms_stats使用(转)
- [每日一题] 11gOCP 1z0-052 :2013-09-6 DBMS_STATS.SET_TABLE_PREFS()使用.............................
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用
- Oracle数据库统计信息收集:dbms_stats包的使用说明书
- [每日一题] 11gOCP 1z0-052 :2013-09-6 DBMS_STATS.SET_TABLE_PREFS()使用...............................A37
- 转:ORACLE 中dbms_stats的使用
- 使用dbms_stats但不生成histogram的方法
- ORACLE 中dbms_stats的使用
- 使用dbms_stats.export导出统计信息