REE
DEGREE参数控制服务器并行收集统计数据的进程数。默认情况下,Oracle数据库中的所有表的DEGREE属性为1,我们可以更改这个参数值,加快统计数据的收集。当DEGREE设置值为DMBS_STATS.AUTO_DEGREE,Oracle根据并行服务器进程数参数(PARALLEL_MAX_SERVERS)值自动分配进程数收集统计信息。对一个数据量较小的对象,使用缺省值1即可。对大数据对象的可以使用DBMS_STAT.DEFAULT_DEGREE参数由数据库自动分配并行度。
示例:DEGREE=4以4个进程收集病人医嘱发送记录的统计信息。
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 CASCADE
在系统上没有执行过索引统计信息收集。使用CASCADE选项相当于在除了收集表和列统计并同时运行 GATHER_INDEX_STATS收集索引统计信息,使用参数DBMS_STATS.AUTO_CASCADE由ORACLE确定是否收集索引统计信息要,参数设置为TRUE强制收集所有索引统计信息,在缺省情况下CASCADE参数值为FALSE。
示例:强制收集病人医嘱发送上的所有索引统计信息。
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;
3.2.2. 锁定和解锁一个表统计信息
在某些情况下我们需要锁定一个特定表的统计息不被更新,以保证执行计划的准确性,我们需要使用DBMS_STATS.LOCK_TABLE_STATS锁定统计信息。要锁定一个表的统计信息我们只需要传入表的拥有者和表名就可以锁定该用户表的统计信息。反之我们要解锁一个锁定的用户对象使用DBMS_STAT.UNLOCK_TABLE_STATS解锁锁定的统计信息。
示例:锁定ZLHIS用户下药品收发记录统计信息。
begin
DBMS_STATS.LOCK_TABLE_STATS(ownname =>'ZLHIS' , tabname =>'药品收发记录' );
end;
示例:解锁被锁定的ZLHIS用户下药品收发记录统计信息。
begin
DBMS_STATS.UNLOCK_TABLE_STATS(ownname =>'ZLHIS' , tabname =>'药品收发记录' );
end;
3.2.3. 删除统计信息
有的时候我们在收集了统计信息却发现新的统计信息比旧的统计信息还要差,因此我们需要将统计信息删除重新收集,以下列出删除统计信息相关过程。
| 名称 |
用途描述 |
| DELETE_INDEX_STATS |
删除特定用户下指定索引列的统计信息 |
| DELETE_TABLE_STATS |
删除特定用户指定表上表行,列和索引列的统计信息 |
| DELETE _SCHEMA_STATS |
删除特定用户所有对像的统计信息 |
| DELETE _DICTIONARY_STATS |
删除数据库所有数据字典统计信息 |
| DELETE _DATABASE_STATS |
删除数据库所有对象统计信息 |
示例:删除ZLHIS用户药品收发记录表统计信息
begin
DBMS_STATS.delete_table_stats(ownname =>'ZLHIS' , tabname =>'药品收发记录' )
end;
3.3. 与统计相关的视图
所有与数据表,列和索引相关的统计信息都可以通过Oracle数据库字典视图查询,常使用的视图有:
| 名称 |
用途描述 |
| DBA_TAB_COLUMNS ALL_TAB_COLUMNS USER_TAB_COLUMNS |
DBA视图描述数据库中所有表列。用户视图仅限于由用户拥有的表,在这些视图中统计信息有关的列由DBMS_STATS 包或ANALYZE语句生成的统计信息。 |
| DBA_TAB_STATISTICS ALL_TAB_STATISTICS USER_TAB_STATISTICS |
描述表的统计信息 |
| DBA_INDEXES ALL_INDEXES USER_INDEXES |
DBA 视图描述在数据库中的所有表上的索引。所有视图都描述在用户可访问的所有表上的索引。用户视图仅限于由用户拥有的索引。在这些视图中的统计信息有关的列包含由DBMS_STATS 包或ANALYZE语句生成的统计 |
在这里我们使用USER_TAB_STATISTICS视图为例,先了解视图USER_TAB_STATISTICS字段的含义后,使用该视图查看表药品收发记录统计信息。
USER_TAB_STATISTICS
| 例名 |
描述 |
| TABLE_NAME |
表名 |
| PARTITION_NAME |
分区表名 |
| PARTITION_POSITION |
分区位置 |
| SUBPARTITION_NAME |
子分区表名 |
| SUBPARTITION_POSITION |
子分区位置 |
| OBJECT_TYPE |
对象类型(表,分区,子分区) |
| NUM_ROWS |
对象中的行记录数 |
| BLOCKS |
对象使用的数据块数 |
| EMPTY_BLOCKS |
对象中的空块数 |
| AVG_SPACE |
对象中的平均可用空间 |
| CHAIN_CNT |
对象中的行连接数 |
| AVG_ROW_LEN |
对象中行记录的平均长度 |
| AVG_SPACE_FREELIST_BLOCKS |
在一个自由列表的所有块的平均可用空间 |
| NUM_FREELIST_BLOCKS |
在一个自由列表的块的数量 |
| AVG_CACHED_BLOCKS |
在缓冲区高速缓存中的平均块数 |
| AVG_CACHE_HIT_RATIO |
平均缓存对象的命中率 |
| SAMPLE_SIZE |
采样样本 |
| LAST_ANALYZED |
最后一次表分析时间 |
| GLOBAL_STATS |
没有合并的分区计算的统计? |
| USER_STATS |
统计信息是否为用户输入 |
| STATTYPE_LOCKED |
锁定统计信息类型 |
| STALE_STATS |
统计信息是否过期 |
例如,我们现在查询药品收发记录的相关统计信息的行数,表分析的采样样本,统计信息是否被锁定,统计信息是否过期这几种情况,可以使用字段NUM_ROWS,SAMPLE_SIZE,LAST_ANALYZED,STATTYPE_LOCKED,STALE_STATS获取相关信息。

4. 结束语
通过我们对统计的了解,已经知道统计信息对Oracle是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里。根据这些统计信息,优化器可以对每个SQL去选择最好的执行计划,统计信息收集作业由Oracle定期自动收