暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle性能篇---No.3(DBMS_STATS package)

DB小榴莲 2020-06-20
2055
库挂了”是每一个DBA的噩梦,这样的声音一旦传达到耳边,第一时间会去看实例是死是活,如果活着,紧接着就是各种select,左边查查,右边查查。查找的主要对象无非就是两个,数据字典和动态性能视图。
数据字典和动态性能视图在数据库被创建的时候,随之创建。如果手工建立数据库,在建完之后,需要手工执行脚本catalog.sql和catproc.sql,他们的位置在oracle Home的rdbms/admin下。

我们可以查看数据字典和动态性能视图的相关信息,如下

select view_name from dba_views where view_name like 'DBA%' order by 1;

select name from V$FIXED_TABLE order by 1;

数据字典视图(dba_*)属于SYS用户,安全起见,我们看到的数据字典视图其实是系统表的同义词(public synonym)。从数据字典里可以看到数据库对象的信息如表和索引。在11.2版本中,从DBCA模板安装的数据库有超过800个可用的数据字典视图。
动态性能视图(v$_*)也属于SYS用户,同样的,安全起见,我们看到的动态性能视图也只是同义词,这些视图基于x$表,这些基表在实例启动的时候生成,实例关闭也会消失,誓与实例共存亡。

数据字典视图有两个字段,一列描述对象的特征,一列是动态的收集过来的对象的信息。如DBA_TABLE中有关于表的物理结构的字段(TABLESPACE_NAME、PCT_free、INITIAL_EXTENT),这些字段会告诉你表的统计信息(如NUM_ROW、AVG_SPACE、AVG_ROW_Len)。要收集这些统计数据,我们必须执行分析语句。对于表,我们将执行以下语句:

ANALYZE TABLE hr.employees COMPUTE STATISTICS;

为了加速(speed up)和自动化对许多对象的分析,可以使用DBMS_UTILITY. analyze_schema或者DBMS_UTILITY.analyze_database去分析用户下的对象:

EXEC DBMS_UTILITY.analyze_schema('HR','COMPUTE’);

对于ANALYZE命令和DBMS_UTILITY函数,这是摆在我们面前的两个选择。Oracle建议使用DBMS_STATS包,因为它更快更准,而且它允许并行删除统计信息、导出、导入和收集统计信息。下面的语句分析了HR用户:

exec DBMS_STATS.Gest_SCHEMA_STATS(‘HR’);

同样,我们可以收集表、索引或数据库的统计信息:

EXEC DBMS_STATS.gather_database_stats(estimate_percent => 20);

EXEC DBMS_STATS.gather_table_stats('HR', 'EMPLOYEES'); 

EXEC DBMS_STATS.gather_index_stats('HR', 'EMP_JOB_IX');

使用DBMS_STATS包,我们还可以删除统计信息:

exec DBMS_STATS.DELETE_TABLE_STATS(‘HR’,‘Employees’);

我们还可以从A库中,把目标的统计信息数据拿到B库中来分析研究。要在不同数据库之间传输统计信息,必须使用统计数据表,如下步骤所示:

1.在源数据库上创建统计表

2.将统计数据从数据字典导出到统计表

3.将统计表(导出/导入、Datapump、Copy)移动到目标数据库

4.将统计数据从统计表导入数据字典

5.删除统计表

在源库中执行:

EXEC DBMS_STATS.create_stat_table('DBA_SCHEMA', 'MY_STAT_TABLE'); 

EXEC DBMS_STATS.export_schema_stats('DBA_SCHEMA','MY_STAT_TABLE',NULL, 'APP_SCHEMA');

以上我们在DBA_SCHEMA用户中创建了存放统计信息的表MY_STAT_TABLE,并将APP_SCHEMA用户中的统计信息数据写进去。

然后,我们用数据泵MY_STAT_TABLE表转移到目标数据库,我们从源数据库导出表,然后将表导入目标数据库,在目标数据库中执行以下语句:

EXEC DBMS_STATS.import_schema_stats('APP_SCHEMA','MY_STAT_TABLE',NULL,'DBA_SCHEMA'); 

EXEC DBMS_STATS.drop_stat_table('DBA_SCHEMA', 'MY_STAT_TABLE');

在这个例子中,已经转移了关于整个APP_SCHEMA的统计信息。我们可以DBMSESTATS数据包的import-*export-*程序选择为整个数据库、一个表、一个索引或一个列传输统计信息。

----------------------------
公众号:DB小榴莲
长按下图二维码关注我,每篇涨点小知识!

最后修改时间:2021-07-14 15:20:51
文章转载自DB小榴莲,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论