一、什么是统计信息
统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息。例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息。CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划。
统计信息是存放在数据字典表中的,如tab$,一般可通过察看某些视图来获取统计信息状况,如DBA_TABLES,DBA_INDEXES,DBA_TAB_COL_STATISTICS, DBA_TAB_HISTOGRAMS等。在这些视图中包含表示统计信息的一些字段,这些字段只有搜集过统计信息之后才有值,否则是空的。例如,last_analyzed 字段表示上次统计信息搜集的时间,可以根据这个字段,快速的了解最近一次统计信息搜集的时间。
二、收集统计信息的方法
使用gather_stats_job自动收集是在创建数据库时自动创建的,并由调度程序进行管理。他会收集数据库中优化程序统计信息缺失或已过时的所有对象的统计信息。
使用dbms_stats 程序包手动收集收集的是系统统计信息。
通过设置数据库初始化参数进行收集。
通过从另一个数据库导入统计信息进行收集。
三、Oracle自动收集统计信息的原理
统计信息对于Oracle数据库来说至关重要,尤其是在使用CBO(基于成本的优化器)模式的时候,统计信息包括表的使用块数、空闲块数、平均行长度、统计信息收集时间等。在Oracle9i数据库中,两种优化器模式RBO和CBO并存,在默认情况下,optimizer_mode参数的值是choose,choose不是优化器模式,它表示在分析数据库中的语句时,如果在对象上有统计信息,就是用CBO方式生成执行计划,如果对象上没有统计信息,是使用RBO模式。
从总体上来说,CB的准确度高于RBO,但是它要求要有统计信息和统计信息必须准确,否则Oracle可能会做出错误的判断。所以在Oracle9i数据库中,我们会自己来规划在什么样的时间采用什么样的策略来收集统计信息。也就是说,Oracle9i的统计信息收集工作必须通过手工方式来实现。
到了Oracle10g,默认情况下,optimizer_mode=all_rows,也就是采用了CBO的方式,为了保证执行计划的准确,在周一到周五(晚22:00-次日6:00),通过一个job(gather_stat_job)自动收集对象的统计信息。这种自动收集统计信息的方式并不是收集所有对象的统计信息,而是收集没有统计信息的对象和统计信息过旧的对象。
Automatic Statistics Gathering是由Scheduler调度GATHER_STATS_JOB作业来完成的,在GATHER_STATS_JOB作业中则调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC存储过程。GATHER_DATABASE_STATS_JOB_PROC是一个内部的存储过程,基本上跟DBMS_STATS.GATHER_DATABASE_STATS的功能一样,但在其内部有优先顺序的考虑,更新量(变化量)越多的表将会越优先收集统计信息。为对象收集统计信息的条件是,之前从来没有收集过的或者是更新的(包括insert,update,delete,truncate)记录数超过当前总记录数10%的表(在Oracle11g中则提供了SET_TABLE_PREFS函数修改10%这个阈值)。记录数的更改量由Oracle数据库自动监控,在初始化参数statistics_level设置为TYPICAL或者ALL时,自动监控即会生效。
3.1 调整当更新量达(变化量)达到多少时开始统计信息收集任务
1
本文分享自微信公众号 - oracle学习笔记,如有侵权,请联系 service001@enmotech.com 删除。 最后修改时间:2019-12-17 11:03:48 文章转载自oracle学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。 评论 |




