平台人生
作者平台人生·2016-12-21 11:28
软件开发工程师·平台人生

数据库使用中的陷阱之统计信息(一)

字数 1415阅读 4413评论 0赞 0

作者韩涛
文章来自微信公众号平台人生


上回说的数据库中的陷阱不知道你是否已经get了,不过和今天要介绍的主角来比较,之前的陷阱只能算是小巫见大巫了。今天要介绍的主角叫做统计信息。千万别小看他,掉进这个陷阱,你的数据库分分钟就会宕掉的。在ORACLE中,统计信息的内容很多,本期先来介绍一下统计信息的概况。
统计信息主要是描述数据库中表。索引大小、规模、数据分布状况等的一类信息。例如:一张表的行数、块数、平均每行大小等等。千万不要小看统计信息,统计信息可以说是数据库中最为重要的一部分!数据库优化器正是根据这些统计信息,才能计算出不同访问路径下,各种计划的成本。也就是说,如果统计信息出现问题,那么会影响到数据库中的所有操作!
在ORACLE 10g以上版本中,可以通过调用dbms_stats内部包,手动收集不同对象的统计信息;当然如果你比较赶时间,ORACLE还非常人性化的为你设置了收集统计信息的自动任务,并配置了默认的策略。ORACLE 10G数据库收集统计信息时间窗口是每日22:00到次日6:00;ORACLE 11G的时间窗口是每日22:00到次日2:00。当然数据库也不会傻到每天对海量的数据进行统计信息收集,对于数据表日变化量小于10%的情况下是不进行收集的。
下面列举一下常用的收集统计信息的方法,友情提示:这些操作并非必须sysdba才可以执行,普通用户对自己的表也可以执行。

Oracle常用统计信息收集命令:

收集表统计信息:
exec dbms_stats.gather_table_stats(ownname=>'',tabname=>'',cascade=>true,estimate_percent=>XXX,method_opt=>’for all columns size 1’);
注:estimate_percent为采样率,XXX为[10-100]的数字,一般情况下建议200GB以下的表均选用XXX=100的采样率;Method_opt选项中for all columns size 1表示对所有字段不收集直方图。
锁定表统计信息:
exec dbms_stats.lock_table_stats(ownname=>'',tabname=>'');
解锁表统计信息:
exec dbms_stats.unlock_table_stats(ownname=>'',tabname=>'');
创建统计信息导入导出的中间表ABC.TEST:
exec dbms_stats.create_stat_table(ownname=>'ABC',stattab=>'TEST');
导出表ABC.OLD统计信息:
exec dbms_stats.export_table_stats(ownname=>'ABC',tabname=>'OLD',stattab=>'TEST');
导入表统计信息至ABC.NEW:
exec dbms_stats.import_table_stats(ownname=>'ABC',tabname=>'NEW',stattab=>'TEST');
删除表上统计信息:
exec dbms_stats.delete_table_stats(ownname=>'',tabname=>'');

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广