Oracle Database 12c DBMS_STATS详解(三)

ALTER_STATS_HISTORY_RETENTION

该过程可以用来修改历史统计信息的保留时间。保留的历史统计信息既可以被自动清理,也可以使用PURGE_STATS手工清理。
语法
DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (retention IN NUMBER);

参数
参数 说明
retention 单位为天。该参数指定了历史统计信息最少的保留天数。可用的
取值范围为【1,36500】。你也可使用如下的数值用于特殊用途:
■ -1: 历史统计信息永远不会被手工清理。
■ 0: 永远不保存历史统计信息,所有的历史统计信息都将会
被自动清除。
■ NULL: 将该参数修改回默认值。
异常
ORA-20000: Insufficient privileges
使用时的注意事项
要执行该过程,你必须要有sysdba权限,或者有ANALYZE ANY DICTIONARY和ANALYZE ANY两个系统权限。

CONVERT_RAW_VALUE
该过程将最小值,最大值,或者直方图结束点实际值等内部表示转换为指定的数据类型。StatRec结构中的minval,maxval和eavals字段,可以通过GET_COLUMN_STATS 或者 PREPARE_COLUMN_VALUES 进行填充,从而作为本过程的输入。
语法

参数
参数 说明
rawval 最大值,最小值,直方图结束点实际值的内部raw表示。
resval 转换后的指定类型的返回值
使用时的注意事项
无。

CONVERT_RAW_VALUE_NVARCHAR

该过程将最大值,最小值或者直方图结束点实际值等内部表示进行转换。StatRec结构中的minval,maxval和eavals字段,可以通过GET_COLUMN_STATS 或者 PREPARE_COLUMN_VALUES 进行填充,从而作为本过程的输入。
语法
DBMS_STATS.CONVERT_RAW_VALUE_NVARCHAR (rawval RAW,
resval OUT NVARCHAR2);

参数
参数 说明
rawval 输出参数指定数据类型的列的最大值或者最小值的内部raw表示。
resval 转换后的指定类型的返回值
使用时的注意事项
无。

CONVERT_RAW_VALUE_ROWID
该过程将最大值,最小值或者直方图结束点实际值等内部表示进行转换。StatRec结构中的minval,maxval和eavals字段,可以通过GET_COLUMN_STATS 或者 PREPARE_COLUMN_VALUES 进行填充,从而作为本过程的输入。
语法
DBMS_STATS.CONVERT_RAW_VALUE_ROWID (rawval RAW,
resval OUT ROWID);

注释
pragma restrict_references(convert_raw_value_rowid, WNDS, RNDS, WNPS, RNPS);

参数
参数 说明
rawval 输出参数指定数据类型的列的最大值或者最小值的内部raw表示。
resval 转换后的指定类型的返回值
使用时的注意事项
无。

COPY_TABLE_STATS

该过程拷贝源【子】分区的统计信息到目标【子】分区。它也拷贝所有依赖对象例如列和索引的统计信息。如果源的统计信息不可用,则什么也不拷贝。指定scale_factor参数,你也可以随意的拷贝部分(例如blks的数目,行数)统计信息
语法
DBMS_STATS.COPY_TABLE_STATS (ownname VARCHAR2,
tabname VARCHAR2,
srcpartname VARCHAR2,
dstpartname VARCHAR2,
scale_factor VARCHAR2 DEFAULT 1,
flags NUMBER DEFAULT NULL,
force BOOLEAN DEFAULT FALSE);

参数
参数 说明
ownname 源表和目标【子】分区的所有者。
tabname 源表和目标【子】分区。
srcpartname 源【子】分区
dtspartname 目标【子】分区
scale_factor dtspartname中的nblks,nrows等的比例因子。
也就是要拷贝的比例因子。
flags oracle内部专用(应当设置为null)。
force 当该参数设置为TRUE时,即便目标【子】分区被锁定,也
要拷贝统计信息。
异常
ORA-20000: Invalid [sub]partition name
ORA-20001: Bad input value

使用时的注意事项
要使用该过程,你必须是该表的所有者,或者你具有ANALYZE ANY权限。对于所有者为SYS的对象,要么你是该表的所有者,要么你需要有ANALYZE ANY DICTIONARY权限或者SYSDBA权限。
对于第一分区列,该过程将更新目标分区的最大值与最小值:
■ 如果分区为hash分区,则目标分区的最大值和最小值将和源分区相同。
■ 如果分区为list分区,则
– 如果目标分区为非默认分区,则
* 目标分区的最小值将被设置为list值的最小值。
* 目标分区的最大值将被设置为list值的最大值。
–如果目标分区为默认分区,则
* 目标分区的最小值将被设置为源分区的最小值。
* 目标分区的最大值将被设置为源分区的最大值。
■ 如果分区为范围分区,则
– 除非目标分区为第一个分区,否则目标分区的最小值将会被设置为原有分
区的上限。如果是第一个分区,最小值就会被设置为目标分区的上限。
– 除非目标分区的上限为MAXVALUE,否则目标分区的最大值将会被设置为
目标分区的上限。这种情况下,目标分区的最大值将会被设置为原有分区
的上限。
– 如果源分区列的最小值和最大值相等,并且也等于源分区的下限,也就是
说该分区的distinct 值为1,则目标分区列的最小值和最大值都将会被
设置为目标分区的下限。所有的分区列都将如此处理。
如果上述条件没有被使用,则第二和子分区列将按照如下规则进行更新。
目标分区列的最大值将会被设置为大于目标分区的上限以及源分区列的
最大值,但是有一个例外。如果目标分区为D,它的前一个分区为D-1,
需要更新的关键列为Cn,倘若前关键列Cn-1的上限在分区D和D-1中相
同,则Cn的最大值会被设置为D的上限(这将会忽视源分区列的最大值)。
■ 如果调整之后该列的最大值和最小值不同,并且该列的distinct值小于1,
则distinct值将被更新为2.
■ 如果源/目标为一个复合分区表的一个分区,则该过程不会拷贝该分区下面的
子分区的统计信息。

CREATE_EXTENDED_STATS

该函数为用户指定的基于一个表的某些列的组合或者表达式在系统中创建列统计信息实体。该扩展的统计信息将会在自动任务或者用户手动收集该表的统计信息时一并收集。我们称呼这种类型的统计信息为“扩展统计信息”。该函数返回新创建的统计信息实体的名称。
这种形式的统计信息创建,是基于SEED_COL_USAGE过程记录的某些列的组合的使用情况来完成的。该函数返回已创建的扩展统计信息的报告。
语法
DBMS_STATS.CREATE_EXTENDED_STATS (ownname VARCHAR2,
tabname VARCHAR2,
extension VARCHAR2)
RETURN VARCHAR2;
DBMS_STATS.CREATE_EXTENDED_STATS (ownname VARCHAR2,
tabname VARCHAR2,
extension VARCHAR2)
RETURN CLOB;

参数
参数 说明
ownname 表的所有者名称。
tabname 表名。
extension 可以是某些列的组合或者表达式。假设指定的表友两列c1,
c2。一个列组合的例子就可以是“(c1,c2)”,表达式的例子
就可以是“(c1+c2)”。
返回值
该函数返回新创建的扩展实体的名称。
异常
ORA-20000: Insufficient privileges / creating extension is not supported
ORA-20001: Error when processing extension
ORA-20007: Extension already exists
ORA-20008: Reached the upper limit on number of extensions

使用时的注意事项
要调用该函数,你必须是该表的所有者,或者你需要拥有ANALYZE ANY权限,对于所有者为SYS的对象,你要么需要是该表的所有者,要么你拥有ANALYZE ANY DICTIONARY权限或者SYSDBA权限。
如下是关于该函数的extension字段的10项限制:
■ 不能包含虚拟列。
■ 不能在所有者为SYS的表上创建。
■ 不能在簇表、索引组织表、临时表和外部表上创建。
■ 在一个表上创建的extension数目不能大于如下值中的最大者(20,表中非
虚拟列数的10%)。
■ 列组合中的列数必须在【2,32】之间。
■ 一列只能出现在一个列组合中。
■ 列组合不能包含表达式。
■ 表达式中至少要包含一列。
■ 表达式中不能包含子查询。
■ COMPATIBLE参数需要大于等于11.0.0.0.0。

Posted in Oracle.