在大多数情况下,自动统计信息收集对于以中等速度修改的数据库对象就足够了。
如下表所示,有时自动收集可能不足或不可用。
表13-2手动收集统计信息的原因
| 问题 | 了解更多 |
|---|---|
| 您执行某些类型的批量加载,并且不能等待维护窗口收集统计信息,因为必须立即执行查询。 | “ 批量装载的在线统计收集 ” |
| 在非代表性工作负载期间,自动统计信息收集将收集固定表的统计信息。 | “ 收集固定对象的统计信息 ” |
| 自动统计信息收集不会收集系统统计信息。 | “ 手动收集系统统计信息 ” |
| 易失表将被删除或截断,然后在白天进行重建。 | “ 使用动态统计信息收集易失表的统计信息 ” |
本节提供了一些典型情况的准则,您可以选择手动进行统计收集:
- 设置样本大小的准则 :在优化器统计信息的上下文中,采样是从表行的随机子集收集统计信息。通过使数据库避免对整个表进行扫描和对整个表进行排序,采样可以最大程度地减少收集统计信息所需的资源。
- 并行收集统计信息的指南 : 缺省情况下,数据库以表或索引级别指定的并行度收集统计信息。
- 分区对象指南 : 对于分区表和索引,
DBMS_STATS可以为每个分区收集单独的统计信息,并为整个表或索引收集全局统计信息。 - 频繁更改对象的准则频繁修改 :表时,应经常收集统计信息,以使它们不会过时,但不要那么频繁地收集统计信息,从而降低性能。
- 外部表准则 : 由于数据库不允许对外部表进行数据操作,因此数据库永远不会将外部表的统计信息标记为过时。例如,如果外部表需要新的统计信息,则因为基础数据文件已更改,那么请重新收集统计信息。
13.3.2.1设置样本大小的准则
在优化器统计信息的上下文中,采样是从表行的随机子集收集统计信息。通过使数据库避免对整个表进行扫描和对整个表进行排序,采样可以最大程度地减少收集统计信息所需的资源。
数据库在处理表中的所有行(这是100%的示例)时,会收集最准确的统计信息。但是,较大的样本量会增加统计信息收集操作的时间。面临的挑战是确定样本大小,以在合理的时间内提供准确的统计信息。
DBMS_STATS用户指定参数时使用采样,该参数ESTIMATE_PERCENT控制表中要采样的行的百分比。为了在获得必要的统计精度的同时最大程度地提高性能,Oracle建议该ESTIMATE_PERCENT参数使用默认设置DBMS_STATS.AUTO_SAMPLE_SIZE。在这种情况下,Oracle数据库将自动选择样本大小。此设置启用以下功能:
- 一种基于散列的算法,比采样速度快得多
该算法读取所有行并产生与100%样本中的统计几乎准确的统计。使用此技术计算的统计信息是确定性的。
- 增量统计
- 并发统计
- 新的直方图类型
该DBA_TABLES.SAMPLE_SIZE列表示用于收集统计信息的实际样本量。
也可以看看:
- “ 混合直方图 ”
- Oracle Database PL / SQL软件包和类型参考以了解更多信息
DBMS_STATS.AUTO_SAMPLE_SIZE
13.3.2.2并行收集统计信息的准则
默认情况下,数据库以表或索引级别指定的并行度收集统计信息。
您可以使用收集过程的degree参数来覆盖此设置DBMS_STATS。Oracle建议设置degree为DBMS_STATS.AUTO_DEGREE。此设置使数据库可以根据对象大小和与并行度相关的初始化参数的设置来选择适当的并行度。
数据库可以串行或并行收集大多数统计信息。但是,数据库不会并行收集一些索引统计信息,包括群集索引,域索引和位图联接索引。在收集并行统计信息时,数据库可以使用采样。
注意:
不要混淆并行收集统计信息 与 收集统计信息。
也可以看看:
- “ 关于并发统计信息收集 ”
- Oracle Database PL / SQL软件包和类型参考以了解更多信息
DBMS_STATS.AUTO_DEGREE
13.3.2.3分区对象准则
对于分区表和索引,DBMS_STATS可以为每个分区收集单独的统计信息,并为整个表或索引收集全局统计信息。
同样,对于复合分区,DBMS_STATS可以收集有关子分区,分区以及整个表或索引的单独统计信息。
要确定要收集的分区统计信息的类型,请granularity为DBMS_STATS过程指定参数。Oracle建议根据分区类型granularity将其设置为默认值,AUTO以收集子分区,分区或全局统计信息。该ALL设置将收集所有类型的统计信息。
也可以看看:
“ 收集分区对象的增量统计信息 ”
13.3.2.4频繁更改对象的准则
频繁修改表时,应经常收集统计信息,以使它们不会过时,但又不会经常收集统计信息而降低性能。
您可能仅需要每周或每月收集一次新的统计信息。最佳实践是使用脚本或作业计划程序定期运行DBMS_STATS.GATHER_SCHEMA_STATS和DBMS_STATS.GATHER_DATABASE_STATS过程。
13.3.2.5外部表准则
因为数据库不允许对外部表进行数据操作,所以数据库绝不会将外部表的统计信息标记为过时。例如,如果外部表需要新的统计信息,则因为基础数据文件已更改,那么请重新收集统计信息。
对于外部表,DBMS_STATS请使用与内部表相同的过程。注意,scanrate的参数DBMS_STATS.SET_TABLE_STATS和DBMS_STATS.GET_TABLE_STATS指定的速率(以MB /秒),在该Oracle数据库的扫描表中的数据,并且只对外部表相关。该SCAN_RATE列显示在DBA_TAB_STATISTICS和DBA_TAB_PENDING_STATS数据字典视图中。
也可以看看:
- “ 创建用于测试的人工优化器统计信息 ”
- Oracle Database PL / SQL软件包和类型参考,以了解
SET_TABLE_STATS和GET_TABLE_STATS - Oracle数据库参考以了解
DBA_TAB_STATISTICS视图




