O_TASK_ADMIN包手动启用:
BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto optimizer stats collection'
, operation => NULL
, window_name => NULL
);
END;
/
如果采用手动管理方式收集统计信息,同样可以使用可以使用DBMS_AUTO_TASK_ADMIN包手动禁用作业:
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto optimizer stats collection'
, operation => NULL
, window_name => NULL
);
END;
/
3.2. DBMS_STATS统计信息管理
对于不断变化的数据库对象,必须定期收集统计数据以便他们准确地描述数据库对象。Oracle推荐使用DBMS_STATS过程 包收集统计信息,并取代现在已经过时的统计信息收集命令ANALYZE 。DBMS_STATS 包包含超过 50 不同的过程,用于收集和管理统计,而且最重要的过程是 GATHER_ * _STATS 程序。这些过程可以用于收集和管理表、 列和索引的统计信息,必须使用对象的所有者或有任何具有系统特权的DBA 角色运行这些程序,以下是DBMS_STATS包中收集统计信息涉及到的过程。
| 名称 |
用途描述 |
| GATHER_INDEX_STATS |
收集特定用户下指定索引列的统计信息 |
| GATHER_TABLE_STATS |
收集特定用户指定表上表行,列和索引列的统计信息 |
| GATHER_SCHEMA_STATS |
收集特定用户所有对像的统计信息 |
| GATHER_DICTIONARY_STATS |
收集数据库所有数据字典统计信息 |
| GATHER_DATABASE_STATS |
收集数据库所有对象统计信息 |
3.2.1. 手动采集表统计信息
这些程序使用的参数是几乎相同,因此这里列举 GATHER_TABLE_STATS 过程的参数作为说明,GATHER_TABLE_STATS包过程用于收集表,分区,索引和列的统计信息。这个过程拥有15个不同的参数。我们在收集表的统计信息时,只需指定ownname和tabname这两个参数,过程包就可以运行。如果表是分区表还需要指分区名称。例如我们对住院费用记录表进行统计信息进行收集,使用以下方式就可以收集到该表的统计信息。
SQL> begin
2 dbms_stats.gather_table_stats(ownname => 'ZLHIS',
3 tabname => '药品库存');
4 end;
5 /
PL/SQL procedure successfullycompleted
在进行数据采集时我们有时会使用到其它输入参数,在这里我们对过程中的其它输入参数介绍。
l ESTIMATE_PERCENT
ESTIMATE_PERCENT参数确定用来计算统计信息行数的百分比,最准确的统计信息收集处理是收集表中的所有行。Oracle 11g使用一种新的采样算法,基于哈希值并提供准确的统计信息。这种新方法精度接近所有行(100%)样品,但顶多消耗10%样品的成本。ESTIMATE_PERCENT的默认值设置为AUTO_SAMPLE_SIZE,将使用这种新算法。GATHER_ * _STATS 程序。我们在对ZLHIS对象收集统计信息时,将ESTIMATE_PRECENT参数设置为较低的值,通常是10%的方式收集,这样做以确保将收集统计数据的结果迅速。当然为了数据库得到更准备统计信息。Oracle强烈建议从 Oracle 11g 起使用ESTIMATE_PRECENT参数的默认值收集统计信息,该参数的取值范围为取值范围[0.000001-100]。
示例:参数ESTIMATE_PERCENT=10以病人医嘱发送数据表数据10%的比例进行数据收集。
begin
dbms_stats.gather_table_stats(ownname => 'ZLHIS',
tabname => '病人医嘱发送',
estimate_percent=> 10,
method_opt => 'for all columns size skewonly',
force => true,
cascade => true,
degree => 4);
end;
l METHOD_OPT
这个参数最常见的功能就是控制直方图的收集方式,但实际上它的功能远不及此,它的实际功能如下所示:
ü 控制哪些列收集基本的统计信息
ü 收集直方图,
ü 收集扩展的统计信息
Method_opt 参数用法分为两个部分,如下图所示:

FOR ALL [indexed " hidden] columns这一部分控制着哪些列将会收集列的基本统计信息,目标列上的最小值,最大值,列上不同值的数量,空值的数量等等。系统默认值为FOR ALL COLUMNS,它将收集表上所有列(包括隐藏列)的基本的统计信息。指定FOR ALL INDEXED COLUMNS 只收集含有索引字段列的基本统计信息。一般不推荐使用这个选项值,因为在数据库环境中的所有 SQL语句所使用的字段,比如SELECT 后面的字段,WHERE后面字段,GROUP BY中的字段,并不只是会引用含有索引的字段。指定FOR ALL HIDDEN COLUMNS收集所有不可见字段基本统计信息,同样在收集统计信息时不推荐使用这个选项值。这个选项值通常只用于在一个所有列的统计信息都是准确的表中新增了一个或几个不可见或者说是虚拟的列,只需要收集这个或者这几个不可见列的统计信息,而不再重复去其他列的统计信息。
Size [size_clause]这一部分控制收集直方图的方式,SIZE 后面可以有以下选项:
AUTO Oracle自己决定根据列的统计信息(sys.col_usage$)以及列的数据倾斜程度(均匀分布程度)决定哪些列需要收集直方图。
INTEGER 指定收集直方图的桶数,桶数最小为 1最大为 254 (针对 11g及以前的版本, 12c后没有这个限制)。注意如果桶数为 1,即SIZE 1 意味着不建立直方图,如果已经有直方图的列则会删除该列的直方图。
REPEAT只在已经有直方图的列上重新收集直方图。REPEAT会确保在全局级别上对已经存在直方图的列重新收集直方图。一般不推荐使用这个选项,因为新的直方图使用的桶数将不能超过旧的直方图中的桶数。假设当前直方图中桶数为 5,当使用SIZE REPEAT重新收集直方图时,新的直方图使用的桶数将不能超过 5,这钟方式可能不会取得好的效果。
SKEWONLY 只在数据不均匀分布的列上收集直方图。
示例:参数METHOD_OPT = 'FOR ALL COLUMNS SIZESKEWONLY'收集病人医嘱分布不均匀列的直方图统计信息。
begin
dbms_stats.gather_table_stats(ownname => 'ZLHIS',
tabname => '病人医嘱发送',
estimate_percent => 10,
method_opt => 'for all columns size skewonly',
force => true,
cascade => true,
degree => 4);
end;
l DEG