在估算对对象的访问代价时,对象统计数据是优化器的重要依靠数据。对象统计数据又可以分为三类数据:表(及其分区、子分区)的统计数据、索引(及其分区、子分区)的统计数据和字段 统计数据。
提示:在 Oracle 中,还有一种特殊的对象:数据字典。实际上,数据字典就是一些属于 SYS、
SYSTEM 或其他系统用户的表。我们在查询一些系统视图(如 ALL_TABLES)时,或者 Oracle 进行一
些内部操作(例如优化器生成执行计划时,就需要从数据字典中读取统计数据)时,会访问到这些 表。同样,执行查询数据字典的语句,优化器也要生成执行计划,因而,这些系统表也需要有正确 的统计数据才能帮助优化器生成最优的执行计划。数据字典的统计数据的维护,需要有 SYSDBA 或者有 ANALYZE ANY DICTIONARY 和 ANALYZE ANY 权限的用户执行,相应的,有一套专门的过程、函数来完成。
5.2.1 表统计数据
关于表(及其分区、子分区)的统计数据主要有以下数据
• NUM_ROWS:表(或者分区、子分区)中的数据记录数;
• BLOCKS:表(或者分区、子分区)数据占用的数据块数;
• EMPTY_BLOCKS:表(或者分区、子分区)中的空数据块数;
• AVG_SPACE:表(或者分区、子分区)中平均空闲空间;
• CHAIN_CNT:表(或者分区、子分区)中链接数据(即一条记录存储在两个或多个数据 块中)记录数;
• AVG_ROW_LEN:表(或者分区、子分区)的数据记录平均长度,单位为字节;
• AVG_SPACE_FREELIST_BLOCKS:表(或者分区、子分区)中,平均一个 FREELIST
(Oracle 用于管理段中的空闲空间的数据结构)上所有数据块的空闲空间;
• NUM_FREELIST_BLOCKS:表(或者分区、子分区)中 FREELIST 上的数据块数量;
• AVG_CACHED_BLOCKS:表(或者分区、子分区)被缓存在内存(Buffer Cache)中数据块平均数量;
• AVG_CACHE_HIT_RATIO:表(或者分区、子分区)的数据块平均缓存命中率;
• SAMPLE_SIZE:用于分析表(或者分区、子分区)的取样大小;
提示:表对象的统计数据可以由视图 DBA/ALL/USER_TAB_STATISTICS 查询。
5.2.2 索引统计数据
关于索引(及其分区、子分区)的统计数据主要有以下数据:
• BLEVEL:索引(或者本地分区索引)树的枝节点层数;
• LEAF_BLOCKS:索引(或者本地分区索引)的叶子数据块数;
• DISTINCT_KEYS:索引(或者本地分区索引)的唯一键值数;
• AVG_LEAF_BLOCKS_PER_KEY:索引(或者本地分区索引)中平均每个键值所占用的叶子数据块数;
• AVG_DATA_BLOCKS_PER_KEY:索引(或者本地分区索引)中平均每个键值所指向的表的数据块数;
• CLUSTERING_FACTOR:索引(或者本地分区索引)的簇集因子(簇集因子反映了每个
键值所指向的表的数据块数直接的连续性,数值越低,这些数据块之间越连续;反之,数值越高,说明这些数据块分布越分散);
• NUM_ROWS:被索引的数据记录数;
• AVG_CACHED_BLOCKS:索引(或者本地分区索引)被缓存在内存(Buffer Cache)中数据块平均数量;
• AVG_CACHE_HIT_RATIO:索引(或者本地分区索引)的数据块平均缓存命中率;
• SAMPLE_SIZE:用于分析索引(或者本地分区索引)的取样大小;
提示:索引对象的统计数据可以由视图 DBA/ALL/USER_IND_STATISTICS 查询。
5.2.3 字段统计数据
关于字段的统计数据主要有以下数据:
• NUM_DISTINCT:字段中的唯一值;
• LOW_VALUE:字段的最小数值;
• HIGH_VALUE:字段的最大数值;
• DENSITY:字段的密度(即平均每个唯一值在该字段中的重复数据数);
• NUM_NULLS:字段中的空值数;
• NUM_BUCKETS:字段柱状图数据的“桶”的数量;
• SAMPLE_SIZE:用于分析字段的取样大小;
• AVG_COL_LEN:字段中数据的平均长度,单位为字节;
提示:字段的统计数据可以由视图 DBA/ALL/USER_TAB_COL_STATISTICS 查询。
此外,字段的统计数据除了上述数据以外,还有一个重要数据:柱状图数据(Histogram),它 反映了字段中数据的分布性。那么柱状图数据是如何反映出数据的分别性呢。我们先设想以下场景:
*场景一:
在某码头上,堆放了许多苹果(假设有 100,000 只),正等待经销商用卡车将它们拉走。经销商每次过来拉走一种颜色的苹果。这些苹果有红色、粉色、青色、黄色和黑色。问题就来了:经销商每次该派多少辆卡车来呢?加入经销商事先不知道每种苹果有多少个,那他只能按照最简单的方法估算车辆数:去苹果数量的平均值。可实际上各种颜色的苹果数量并不相等(红色有 50,000 只,
粉色有 30,000 只,青色有 10,000 只,黄色有 8,000 只,黑色有 2,000 只),这就会导致估算出的车辆数和实际需要的车辆数出现重大偏差。为了正确估算出每次需要的车辆数,经销商按照以下方法对苹果进行了统计:将不同颜色的苹果装满大小不同的集装箱(或者大桶),这样,根据集装箱大小就可以估算出每次该派多少辆卡车。
*场景二:
同样是这批苹果,但这一次经销商准备按照苹果的重量来运走苹果:小于 100g;
100.0g104.99g;105.0g109.99g… 而苹果的重量各不相同,从 50g 到 500g 都有,但是 150g~160g
以及 200g~220g 重量的苹果数量相对较多,其他重量的苹果相对比较平均。于是,为了正确估算出每次需要排除的卡车数量,经销商按照苹果重量由轻到重装入了 5000 个容量相同的桶里面。这样, 只有知道某个重量方法的苹果存放在多少个桶里面,就能正确估算每次需要的车辆数了。
和苹果经销商的做法相似,柱状图数据就是将字段中数据按照其分布性用“桶”(Bucket)来 度量:采用场景一的分布方法统计出的柱状图称为频率(Frequency)柱状图;采用场景二的分布方法统计出的柱状图称为高度平衡(Height Balanced)柱状图。
柱状图数据清晰地描述出来字段的分布性。优化器在使用了绑定变量窥视(或者语句的查询谓
词给出了实际数值)对语句进行解析、优化时,利用柱状图,就可以知道谓词条件可以命中多少数 据,从而优化出更加符合查询条件的执行计划。
提示:字段的柱状图数据可以由视图 DBA/ALL/USER_HISTOGRAMS 查询。
5.2.4 扩展统计数据
在 11g 中,除了可以为单独每个字段生成相关的统计数据以外,还可以为两个或多个字段组
(或包含一个或多个字段的表达式)生成扩展统计数据。例如:字段组(COLA, COLB);表达式
(UPPER(COLA)||COLB)。
注意,字段扩展存在以下限制:
1、扩展内容中不能包含虚字段(11g 新特性,即一个表达式,表达式可以包含实际字段,并且虚字段不会存储物理数据,而是在查询时由表达式计算得出);
2、不能为 SYS 用户下的表创建扩展;
3、不能在簇表(Cluster Table)、索引组织表(Index Organized Table,IOT)、临时表
(Temporary Table)和外部表(External Table)上创建扩展;
4、一张表上的扩展数不能超过 20,也不能超过该表实际字段(除虚字段外)数的 10%;
5、字段组中最少包含 2 个、最多包含 32 个实际字段;
6、一个字段不能在字段组中出现 2 次或以上(表达式不受限制);
7、字段组不能包含其他扩展;
8、表达式中最少包含一个字段;
9、表达式不能包含子查询;
10、系统蚕食 COMPATIBLE 必须是 11.0.0.0.0 或以上;
创建扩展
在收集扩展统计数据之前,需要先创建一个扩展信息。创建扩展信息的方式有两种:在收集表 的统计数据是,在 METHOD_OPT 中指定字段组(或表达式),由 Oracle 自动创建扩展信息;调用函数 DBMS_STATS.CREATE_EXTENDED_STATS 手动创建。以下是该函数的描述。
输入参数:
• OWNNAME、TABNAME:参见之前解释;
• EXTENSION:扩展的字段组(或表达式); 返回数据:
• 新创建扩展名;
示例:

提示:可以通过视图 DBA/ALL/USER_STAT_EXTENTIONS 查询表上面创建了哪些扩展信息。
显示扩展名
函数 DBMS_STATS.SHOW_EXTENDED_STATS_NAME 可以根据扩展的定义查询其扩展名。
输入参数:
• OWNNAME、TABNAME、EXTENSION:参见之前解释.
示例:

删除扩展
调用过程 DBMS_STATS.DROP_EXTENDED_STATS 可以删除已经创建扩展,同时删除其统计数据。
输入参数:
• OWNNAME、TABNAME、EXTENSION:参见之前解释;
示例:

5.2.5 对象统计数据的管理
在 Oracle,提供了多种灵活的方法给用户对对象统计数据进行管理,使得用户可以根据需要定制灵活对象统计数据维护策略。例如,收集统计数据,可以在多个层次上进行:数据库、用户
(Schema)以及对象级别。
收集对象统计数据
对象统计数据的收集,可以在多个层次上进行,分别由不同的存储过程实现。其中,字段的统计数据不能被单独收集,而是伴随表的统计数据的收集的同时收集。以下逐个介绍相关的收集存储 过程。
收集表统计数据
存储过 DBMS_STATS.GATHER_TABLE_STATS 程用于收集表和字段的统计数据,并且可以由参数决定是否同时收集其索引的统计数据。
输入参数:
• OWNNAME:需要收集统计数据的表的所有者;
• TABNAME:需要收集统计数据的表名;
• PARTNAME:需要收集统计数据的表的分区名,默认为 NULL,它和参数 GRANULARITY
共同决定分区表统计数据的收集级别;
• ESTIMATE_PERCENT:估算百分比,默认值为全局参数(11g 中为全局选项,如果表设置了该选项,则去表的选项设置)的相应设置,具体解释可以参照全局参数部分;
• BLOCK_SAMPLE:是否按照数据块采用。默认值为 FALSE。
TRUE:依据估算百分比随机读取多个数据块来计算统计数据;
FALSE:依据估算百分比随机读取多个数据记录来计算统计数据;
提示:按照数据块随机取样效率比按照数据记录随机取样效率更高,适合于数据在数据块上分布比 较均匀的表,否则,其精度较低。
• METHOD_OPT:收集方法选项,默认值为全局参数(11g 中为全局选项,如果表设置了该选项,则去表的选项设置)的相应设置,具体解释可以参照全局参数部分;
• DEGREE:收集过程中的查询并行度,默认值为全局参数(11g 中为全局选项)的相应设置,具体解释可以参照全局参数部分;
• GRANULARITY:分区表统计数据收集粒度,默认值为全局参数(11g 中为全局选项,如果表设置了该选项,则去表的选项设置)的相应设置,具体解释可以参照全局参数部分;
• CASCADE:是否同时收集表上索引的统计数据,默认值为全局参数(11g 中为全局选项, 如果表设置了该选项,则去表的选项设置)的相应设置,具体解释可以参照全局参数
部分;
• STATTAB、STATID、STATOWN:参见之前解释;
• NO_INVALIDATE:是否禁止使内存中依赖于统计数据发生变化的表的游标失效,默认值 为全局参数(11g 中为全局选项)的相应设置,具体解释可以参照全局参数部分;
• STATTYPE:收集的统计数据类型,默认值为’DATA’;
o ‘CACHE’:仅收集缓存相关的统计数据(平均缓存数据块数、平均缓存命中率);
o ‘DATA’:仅收集数据相关的统计数据(除平均缓存数据块数、平均缓存命中率之外 的统计数据);
o ‘ALL’:收集所有统计数据;
• FORCE:当对象统计数据被锁住时,是否强制收集统计数据,默认值为 FALSE;
收集索引统计数据
存储过程 DBMS_STATS.GATHER_INDEX_STATS 用于收集索引的统计数据。
输入参数:
• OWNNAME:需要收集统计数据的索引的所有者;
• INDNAME:需要收集统计数据的索引名;
• PARTNAME:需要收集统计数据的本地分区索引的分区名,默认为 NULL,它和参数
GRANULARITY 共同决定本地分区索引统计数据的收集级别;
• ESTIMATE_PERCENT、STATTAB、STATID、STATOWN、DEGREE、GRANULARITY、
NO_INVALIDATE、STATTYPE、FORCE:参见之前解释;
收集固态表统计数据
存储过程 DBMS_STATS.GATHER_FIXED_OBJECTS_STATS 用于收集固态表及其字段和索引的统计数据。
提示:Oracle 的所有固态表都属于 SYS 用户。
输入参数:
• STATTAB:、STATID、STATOWN、NO_INVALIDATE:参见之前解释;
收集数据字典统计数据
存储过程 DBMS_STATS.GATHER_DICTIONARY_STATS 用于收集数据字典的统计数据,并且可以由参数决定是否同时收集其索引的统计数据。
输入参数:
• ESTIMATE_PERCENT、BLOCK_SAMPLE、METHOD_OPT、DEGREE、GRANULARITY、
CASCADE、STATTAB、STATID、STATOWN、NO_INVALIDATE、STATTYPE:参见之前解释;
• COMP_ID:RDBMS 组件的编号(可以通过视图 DBA_REGISTRY 查询),默认为 NULL, 即所有 RDBMS 组件的数据字典。任何情况下,SYS 和 SYSTEM 用户下数据字典都会被收集。
• OPTIONS:收集对象选项,以决定哪些对象被收集统计数据,默认为’GATHER AUTO’;
o ‘GATHER’:收集用户的所有对象的统计数据;
o ‘GATHER AUTO’:由 Oracle 自己决定哪些对象需要收集统计数据,以及如何收集统计数据。指定该选项以后,除 COMP_ID、STATTAB、STATID 和 STATOWN 之外的所有参数都会被忽略,被收集了统计数据的对象存储到输出参数 OBJLIST 中;
o ‘GATHER STALE’:仅收集统计数据陈旧的对象,被收集了统计数据的对象存储到输出参数 OBJLIST 中;
o ‘GATHER EMPTY’:仅收集没有统计数据的对象,被收集了统计数据的对象存储到输出参数 OBJLIST 中;
o ‘LIST AUTO’:不收集统计数据,仅返回自动收集(‘GATHER AUTO’)选项下,Oracle
认为需要收集统计数据的对象列表,存储到输出参数 OBJLIST 中;
o ‘LIST STALE’:不收集统计数据,仅返回集统计数据陈旧的对象列表,存储到输出参数 OBJLIST 中;
o ‘LIST EMPTY’:不收集统计数据,仅返回没有统计数据的对象列表,存储到输出参数 OBJLIST 中;
• OBJ_FILTER_LIST:对象过滤条件列表,默认值为 NULL,这是 11g 新增参数。如果指定了该参数,则仅检查符合参数所定义的过滤条件的对象,并依据 OPTIONS 设置,找出需要收集统计数据的对象。条件不区分大小写,且可以包含通配符。可以输入的条件为:
o OWNNAME:对象所有者;
o OBJTYPE:对象类型,可以为’TABLE’或者’INDEX’;
o PARTNAME:分区名;
o SUBPARTNAME:子分区名;
输出参数:
• OBJLIST:依照 OPTIONS 设置,返回需要被收集统计数据的对象列表;
收集用户对象的统计数据
存储过程 DBMS_STATS.GATHER_SCHEMA_STATS 用于收集某个用户下的对象的统计数据。
输入参数:
• OWNNAME、ESTIMATE_PERCENT、BLOCK_SAMPLE、METHOD_OPT、DEGREE、
GRANULARITY、CASCADE、STATTAB、STATID、OPTIONS、STATOWN、NO_INVALIDATE、
STATTYPE、FORCE、OBJ_FILTER_LIST:参见之前解释;
• GATHER_TEMP:是否收集临时表的统计数据,默认值为 FALSE;如果为 TURE,仅在创建表时使用了 ON COMMIT PRESERVE ROWS 子句的临时表会被收集;
• GATHER_FIXED:是否收集固态表的统计数据,默认值为 FALSE;如果为 TRUE,仅当
OWNNAME 为’SYS’或者 NULL 时有效。并且,在收集固态表的统计数据时,参数
ESTIMATE_PERCENT、BLOCK_SAMPLE、STATTAB、STATID 和 STATOWN 会被忽略;
输出参数:
• OBJLIST:参见之前解释;
收集数据库所有对象的统计数据
存储过程 DBMS_STATS.GATHER_DATABASE_STATS 用于收集某个用户下的对象的统计数据。
输入参数:
• ESTIMATE_PERCENT、BLOCK_SAMPLE、METHOD_OPT、DEGREE、GRANULARITY、
CASCADE、STATTAB、STATID、OPTIONS、STATOWN、NO_INVALIDATE、GATHER_TEMP、
GATHER_FIXED、STATTYPE、OBJ_FILTER_LIST:参见之前解释;
• GATHER_SYS:是否收集 SYS 用户的对象的统计数据,默认值为 TRUE;
输出参数:
• OBJLIST:依照参见之前解释;
示例:


表、索引和字段的相关统计数据都可以被人为设置或重新修改为指定值。
设置、修改字段统计数据
存储过程 DBMS_STATS.SET_COLUMN_STATS 用于设置或修改表的某个字段的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、
FORCE:参见之前解释;
• COLNAME:需要设置统计数据的字段名;
• DISTCNT:字段唯一值数,默认为 NULL,即不修改原有值;
• DENSITY:字段密度,默认为 NULL,即不修改原有值;
• NULLCNT:字读中空值数,默认为 NULL,即不修改原有值;
• SREC:统计数据结构。这是一个自定义的 RECORD 类型的结构,可以由该数据结构指定设置字段的最大、最小值和柱状图数据,成员包括:
o EPC:柱状图数据数组的成员数,取值范围为 2~256。当字段类型为 NVARCHAR、
ROWID 时,不能设置柱状图,该数值必须设置为 2;
o MINVAL:字段最小值;
o MAXVAL:字段最大值;
o BKVALS:当柱状图为频率柱状图时,该数组存储的是每个桶所对应的唯一值在字 段中的重复数;当柱状图为高度平衡柱状图时,设置为 NULL;
o NOVALS:当柱状图为频率柱状图时,该数组存储的是每个桶所对应的唯一值;当 柱状图为高度平衡柱状图时,每个桶中的最大值;
o CHVALS:该数据仅对字符类型数据有效,存储与 NOVALS 相应的实际字符数据;
o EAVS:是否需要实际字符数据,0 为不需要,1 为需要;
• AVGCLEN:字段平均长度,默认为 NULL,即不修改原有值;
• FLAGS:标识数值,用于 Oracle 内部收集数据过程中的行为决策,默认值为 NULL;
设置、修改表统计数据
存储过程 DBMS_STATS.SET_TABLE_STATS 用于设置或修改表的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、
FORCE:参见之前解释;
• NUMROWS:表的数据记录数,默认为 NULL,即不修改原有值;
• NUMBLKS:表的数据占用的数据块数,默认为 NULL,即不修改原有值;
• AVGRLEN:表的数据记录平均长度,默认为 NULL,即不修改原有值;
• FLAGS:标识数值,用于 Oracle 内部收集数据过程中的行为决策,默认值为 NULL;
• CACHEDBLK:表的数据块平均缓存数,默认为 NULL,即不修改原有值;
• CACHEHIT:表的数据块平均缓存命中率,默认为 NULL,即不修改原有值;
提示:如要收集缓存统计数据(CACHEDBLK、CACHEHIT),需要设置参数"_cache_stats_monitor"为
TRUE,它的默认值为 FALSE。如果希望优化器做代价估算时将缓存统计数据考虑进去,则需要设置参数"_optimizer_cache_stats"为 TRUE,它的默认值也是 FALSE。
设置、修改索引统计数据
存储过程 DBMS_STATS.SET_INDEX_STATS 用于设置或修改索引的统计数据。
输入参数:
• OWNNAME、INDNAME、PARTNAME、STATTAB、STATID、FLAGS、STATOWN、
NO_INVALIDATE、CACHEDBLK、CACHEHIT、FORCE:参见之前解释;
• NUMROWS:被索引的数据记录数,默认为 NULL,即不修改原有值;
• NUMLBLKS:索引的叶子数据块数,默认为 NULL,即不修改原有值;
• NUMDIST:索引的唯一键值数,默认为 NULL,即不修改原有值;
• AVGLBLK:索引键值平均占用叶子数据块数,默认为 NULL,即不修改原有值;
• AVGDBLK:索引键值平均指向表数据块数,默认为 NULL,即不修改原有值;
• CLSTFCT:索引的簇集因子,默认为 NULL,即不修改原有值;
• INDLEVEL:索引树的枝节点层数,默认为 NULL,即不修改原有值;
• GUESSQ:索引组织表(IOT)猜测质量,仅用于索引组织表;
提示:在创建索引组织表时,可以为其创建一个(仅可以创建一个)位图映射表(Mapping Table)。映射表的每个位都与索引组织表的记录的 ROWID 映射,因而可以通过映射表猜测索引组织的物理
数据。但随着索引组织表的更新维护(如索引分裂),其数据记录物理位置会发生变化,从而导致 与由映射表猜测的质量下降。GUESSQ 即为猜测与实际数据之间的偏差百分比;
• EXT_STATS:用户自定义扩展统计数据;
• STATTYPOWN:用户自定义统计数据类型的所有者;
• STATTYPNAME:用户自定义统计数据类型的名称;
示例:
HELLODBA.COM>exec dbms_stats.set_table_stats(‘DEMO’,‘T_TABLES’,NUMBLKS=>830);
锁定/解锁对象统计数据
我们在指定定期更新统计数据策略时,可以安排定时作业对整个数据库、或某个用户下所有表进行更新。但是,对于某些表,例如一些支撑数据(如公司的部门信息),它们的数据相对比较稳 定,基本上不会出现数据变化。那么我们就不希望定期做检查、更新这些表的统计数据,减少对资 源的消耗。这种情况下,我们在收集到了这些表的统计数据后,就可以锁定它们。这样,在调用相 关过程收集或修改对象统计数据时,除非指定了 FORCE 参数为 TRUE,否则就不会坚持、更新被锁住对象的统计数据。
锁定表统计数据
存储过程 DBMS_STATS.LOCK_TABLE_STATS 用于锁定表及其分区、索引和字段的统计数据。
输入参数:
• OWNNAME、TABNAME、STATTYPE:参见之前解释;
解锁表统计数据
存储过程 DBMS_STATS.UNLOCK_TABLE_STATS 用于解锁表及其分区、索引和字段的统计数据。
输入参数:
• OWNNAME、TABNAME、STATTYPE:参见之前解释;
锁定分区统计数据
存储过程 DBMS_STATS.LOCK_PARTITION_STATS 用于锁定分区及其索引的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME:参见之前解释;
解锁分区统计数据
存储过程 DBMS_STATS.UNLOCK_PARTITION_STATS 用于解锁分区及其索引的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME:参见之前解释;
锁定用户的所有对象统计数据
存储过程 DBMS_STATS.LOCK_SCHEMA_STATS 用于锁定某个用户的统计数据。
输入参数:
• OWNNAME、STATTYPE:参见之前解释;
解锁用户的所有对象统计数据
存储过程 DBMS_STATS.UNLOCK_SCHEMA_STATS 用于解锁某个用户的统计数据。
输入参数:
• OWNNAME、STATTYPE:参见之前解释;
示例:

出/导入对象统计数据
Oracle 提供了一套存储过程用户对象统计数据的导出、导入,方便统计数据的迁移、及副本数据替换。
导出字段统计数据
存储过程 DBMS_STATS.EXPORT_COLUMN_STATS 用于导出字段的统计数据。输入参数:
• OWNNAME、TABNAME、COLNAME、PARTNAME、STATTAB、STATID、STATOWN:参见 之前解释;
导入字段统计数据
存储过程 DBMS_STATS.IMPORT_COLUMN_STATS 用于导入字段的统计数据。
输入参数:
• OWNNAME、TABNAME、COLNAME、PARTNAME、STATTAB、STATID、STATOWN、
NO_INVALIDATE、FORCE:参见之前解释;
导出表统计数据
存储过程 DBMS_STATS.EXPORT_TABLE_STATS 用于导出表及其分区、索引和字段的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、CASCADE、STATOWN:参见 之前解释;
导入表统计数据
存储过程 DBMS_STATS.IMPORT_TABLE_STATS 用于导入表及其分区、索引和字段的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、CASCADE、STATOWN、
NO_INVALIDATE、FORCE:参见之前解释;
导出索引统计数据
存储过程 DBMS_STATS.EXPORT_INDEX_STATS 用于导出索引及其分区的统计数据。
输入参数:
• OWNNAME、INDNAME、PARTNAME、STATTAB、STATID、STATOWN:参见之前解释;
导入索引统计数据
存储过程 DBMS_STATS.IMPORT_INDEX_STATS 用于导入索引及其分区的统计数据。
输入参数:
• OWNNAME、INDNAME、PARTNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、
FORCE:参见之前解释;
导出数据字典统计数据
存储过程 DBMS_STATS.EXPORT_DICTIONARY_STATS 用于导出所有数据字典及其分区、索引和字段的统计数据。
输入参数:
• STATTAB、STATID、STATOWN:参见之前解释;
导入数据字典统计数据
存储过程 DBMS_STATS.IMPORT_DICTIONARY_STATS 用于导入所有数据字典及其分区、索引和字段的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、FORCE:参见之前解释;
导出固化表统计数据
存储过程 DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS 用于导出所有固化表及其分区、索引和字段的统计数据。
输入参数:
• STATTAB、STATID、STATOWN:参见之前解释;
导入固化表统计数据
存储过程 DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS 用于导入所有固化表及其分区、索引和字段的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、FORCE:参见之前解释;
导出用户统计数据
存储过程 DBMS_STATS.EXPORT_SCHEMA_STATS 用于导出用户的所有对象的统计数据。
输入参数:
• OWNNAME、STATTAB、STATID、STATOWN:参见之前解释;
导入用户统计数据
存储过程 DBMS_STATS.IMPORT_SCHEMA_STATS 用于导入用户的所有对象的统计数据。
输入参数:
• OWNNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、FORCE:参见之前解释;
导出数据库统计数据
存储过程 DBMS_STATS.EXPORT_DATABASE_STATS 用于导出整个数据库的所有对象的统计数据。
输入参数:
• STATTAB、STATID、STATOWN:参见之前解释;
导入数据库统计数据
存储过程 DBMS_STATS.IMPORT_DATABASE_STATS 用于导入整个数据库的所有对象的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、FORCE:参见之前解释;
示例:

删除对象统计数据
Oracle 提供了一套过程用于在不同级别删除对象统计数据。
删除字段统计数据
存储过程 DBMS_STATS.DELETE_COLUMN_STATS 用于删除字段的统计数据。
输入参数:
• OWNNAME、TABNAME、COLNAME、PARTNAME、STATTAB、STATID、STATOWN、
NO_INVALIDATE、FORCE:参见之前解释;
• CASCADE_PARTS:是否同时删除分区表中所有分区的字段的统计数据,仅当表为分区 表、且 PARTNAME 为 NULL 是有效;
• COL_STAT_TYPE:11g 参数,需要删除的字段统计数据类型,默认为’ALL’;
o ‘CACHE’:仅删除缓存相关的统计数据(平均缓存数据块数、平均缓存命中率);
o ‘DATA’:仅删除数据相关的统计数据(除平均缓存数据块数、平均缓存命中率之外 的统计数据);
o ‘ALL’:删除所有统计数据;
删除表统计数据
存储过程 DBMS_STATS.DELETE_TABLE_STATS 用于删除表的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、
STATTYPE、FORCE、CASCADE_PARTS:参见之前解释;
• CASCADE_COLUMNS:是否同时删除表中所有索引的字段的统计数据;
• CASCADE_INDEXES:是否同时删除表中所有索引的字段的统计数据;
删除索引统计数据
存储过程 DBMS_STATS.DELETE_INDEX_STATS 用于删除索引的统计数据。
输入参数:
• OWNNAME、TABNAME、PARTNAME、STATTAB、STATID、CASCADE_PARTS、STATOWN、
NO_INVALIDATE、STATTYPE、FORCE:参见之前解释;
删除数据字典统计数据
存储过程 DBMS_STATS.DELETE_DICTIONARY_STATS 用于删除数据字典的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、STATTYPE、FORCE:参见之前解释;
删除固化表统计数据
存储过程 DBMS_STATS.DELETE_FIXED_OBJECTS_STATS 用于删除固化表的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、STATTYPE、FORCE:参见之前解释;
删除用户统计数据
存储过程 DBMS_STATS.DELETE_SCHEMA_STATS 用于删除某个用户的所有对象的统计数据。
输入参数:
• OWNNAME、STATTAB、STATID、STATOWN、NO_INVALIDATE、STATTYPE、FORCE:参 见之前解释;
删除数据库统计数据
存储过程 DBMS_STATS.DELETE_SCHEMA_STATS 用于删除整个数据库的所有对象的统计数据。
输入参数:
• STATTAB、STATID、STATOWN、NO_INVALIDATE、STATTYPE、FORCE:参见之前解释;
示例:

重置对象统计数据
当用户调用 DBMS_STATS 的过程重新收集或修改对象统计数据时,如果系统表空间 SYSAUX 为
ONLINE 状态时,原有统计数据会被作为历史数据存储起来。同时,Oracle 也提供了一套存储过程用于恢复历史数据。历史数据的快照信息可以通过视图 DBA/ALL/USER_TAB_COL_STATS_HISTORY 查看。
重置表统计数据
存储过程 DBMS_STATS.RESTORE_TABLE_STATS 用于重置表的统计数据。
提示:如果重置时间点到当前时间之间,表的字段数发生过改变,则无法重置统计数据。
输入参数:
• OWNNAME、TABNAME、FORCE、NO_INVALIDATE:参见之前解释;
• AS_OF_TIMESTAMP:需要重置到的时间点;
• RESTORE_CLUSTER_INDEX:是否同时重置簇表的簇集索引,默认值为 FASLE,仅对簇表有效;
重置数据字典统计数据
存储过程 DBMS_STATS.RESTORE_DICTIONARY_STATS 用于重置数据字典的统计数据。
输入参数:
• AS_OF_TIMESTAMP、FORCE、NO_INVALIDATE:参见之前解释;
重置固化表统计数据
存储过程 DBMS_STATS.RESTORE_FIXED_OBJECTS_STATS 用于重置固化表的统计数据。
输入参数:
• AS_OF_TIMESTAMP、FORCE、NO_INVALIDATE:参见之前解释;
重置用户统计数据
存储过程 DBMS_STATS.RESTORE_SCHEMA_STATS 用于重置用户的所有对象的统计数据。
输入参数:
• OWNNAME、AS_OF_TIMESTAMP、FORCE、NO_INVALIDATE:参见之前解释;
重置数据库统计数据
存储过程 DBMS_STATS.RESTORE_DATABASE_STATS 用于重置数据库的所有对象的统计数据。
输入参数:
• AS_OF_TIMESTAMP、FORCE、NO_INVALIDATE:参见之前解释;
示例:





