13.3.8.3.1增量统计信息维护的注意事项
启用增量统计信息维护会带来多种后果。
具体来说,请注意以下几点:
- 如果表使用复合分区,则数据库仅收集有关已修改子分区的统计信息。数据库不会在子分区级别收集未修改子分区的统计信息。这样,数据库通过跳过未修改的分区来减少工作量。
- 如果表使用增量统计信息,并且该表具有本地分区索引,则数据库将在全局级别和已修改(未修改)索引分区上收集索引统计信息。数据库不会从分区级索引统计信息中生成全局索引统计信息。而是,数据库通过执行完整索引扫描来收集全局索引统计信息。
- 混合分区表:(一个表,其中一些分区存储在数据文件段中,而某些分区存储在外部数据源中)中含有内部和外部分区。仅对于内部分区,DDL更改会在单个分区和表本身上调用增量统计信息维护。例如,如果
june18是内部分区,则ALTER TABLE ... MODIFY PARTITION jun18 ...在统计信息收集期间触发增量统计信息维护;如果june18是外部分区,则不会进行增量维护。 - 该
SYSAUX表空间占用额外的空间来维持分区表全局统计信息。
也可以看看:
- Oracle Database VLDB和分区指南,以学习如何创建混合分区表
- Oracle Database PL / SQL软件包和类型参考以了解更多信息
DBMS_STATS
13.3.8.3.2使用SET_TABLE_PREFS 启用增量统计
要为分区表启用增量统计信息维护,请使用DBMS_STATS.SET_TABLE_PREFS将该INCREMENTAL值设置为true。当INCREMENTAL设置为时false,这是默认值,数据库使用全表扫描来维护全局统计信息。
- 在
PUBLISH对分区表值true。 - 在
INCREMENTAL对分区表值true。 - 统计数据收集程序必须指定
ESTIMATE_PERCENT 值为AUTO_SAMPLE_SIZEGRANULARITY 值为AUTO (即默认值)
示例13-3启用增量统计
假设PUBLISH分区表的sh.sales值为true。以下程序为该表启用增量统计信息:
EXEC DBMS_STATS.SET_TABLE_PREFS('sh', 'sales', 'INCREMENTAL', 'TRUE');select dbms_stats.get_prefs('ESTIMATE_PERCENT','scott','emp') from dual; AUTO_SAMPLE_SIZE select dbms_stats.get_prefs('granularity','scott','emp') from dual; AUTO select dbms_stats.get_prefs('publish','scott','emp') from dual; TRUE select dbms_stats.get_prefs('INCREMENTAL','scott','emp') from dual; TRUE13.3.8.3.3关于APPROXIMATE_NDV_ALGORITHM设置
所述DBMS_STATS.APPROXIMATE_NDV_ALGORITHM 偏好指定提要生成算法,无论是HyperLogLog或自适应采样。
该INCREMENTAL_STALENESS首选项控制数据库何时重新格式化使用自适应采样格式的大纲。
APPROXIMATE_NDV_ALGORITHM偏好具有以下可能值:REPEAT OR HYPERLOGLOG :这是默认值。如果在表上启用INCREMENTAL,则数据库将保留使用自适应采样算法的任何现有提要的格式。但是,数据库以HyperLogLog格式创建任何新的概要。当现有性能可接受时,并且您不想承担重新格式化旧内容的性能成本时,此方法很有吸引力。ADAPTIVE SAMPLING :数据库对所有概要使用自适应采样算法。这是最保守的选择。HYPERLOGLOG :该数据库对所有新的和过时的摘要使用HyperLogLog算法。
该INCREMENTAL_STALENESS优先控制时,大纲被认为是过时的。当APPROXIMATE_NDV_ALGORITHM设置HYPERLOGLOG时,将首选 项INCREMENTAL_STALENESS设置以下值:
ALLOW_MIXED_FORMAT :这是默认值。如果指定此值,如果满足以下条件,则数据库并不会考虑现有的自适应采样梗概为失效:- 概要是新鲜的,未过时的。
- 您手动收集统计信息。
因此,传统和HyperLogLog格式的概要都可以共存。但是,随着时间的流逝,自动统计信息收集作业会重新收集有关使用旧格式的概要的统计信息,并将其替换为HyperLogLog格式的概要。这样,自动统计信息收集作业将逐步淘汰旧格式。手动统计信息收集作业不会重新格式化使用自适应采样格式的概要。
- 空值 : 具有概要格式的概要的任何分区都被视为陈旧的,这立即触发数据库以收集统计信息以获取陈旧的概要。
优点是性能成本仅发生一次。缺点是在大型表上收集所有统计信息可能会占用大量资源。
13.3.8.3.4配置摘要生成:示例
这些示例显示了将概要切换到新的HyperLogLog格式的不同方法,既保守又激进。
示例13-4采取保守方法重新格式化概要
在此示例中,您允许sh.sales表的混合格式的大纲共存。混合格式产生的统计数据准确性较低。但是,你不需要为表的所有分区regather统计。
为确保所有新的和过时的提要都使用HyperLogLog算法,请将APPROXIMATE_NDV_ALGORITHM首选项设置为HYPERLOGLOG。
为确保自动统计信息收集作业随着时间的推移逐渐重新格式化过时的摘要,请将设置INCREMENTAL_STALENESS为ALLOW_MIXED_FORMAT。
BEGIN
DBMS_STATS.SET_TABLE_PREFS
( ownname => 'sh'
, tabname => 'sales'
, pname => 'approximate_ndv_algorithm'
, pvalue => 'hyperloglog' );
DBMS_STATS.SET_TABLE_PREFS
( ownname => 'sh'
, tabname => 'sales'
, pname => 'incremental_staleness'
, pvalue => 'allow_mixed_format' );
END;
示例13-5:采用积极的方法重新格式化概要
在此示例中,您强制所有概要对表使用HyperLogLog算法sh.sales。在这种情况下,数据库必须收集表的所有分区的统计信息。
为确保所有新的和过时的提要都使用HyperLogLog算法,请将APPROXIMATE_NDV_ALGORITHM首选项设置为HYPERLOGLOG。
要强制数据库立即 重新收集表中所有分区的统计信息并以新格式存储它们,请将INCREMENTAL_STALENESS首选项设置为null。
BEGIN
DBMS_STATS.SET_TABLE_PREFS
( ownname => 'sh'
, tabname => 'sales'
, pname => 'approximate_ndv_algorithm'
, pvalue => 'hyperloglog' );
DBMS_STATS.SET_TABLE_PREFS
( ownname => 'sh'
, tabname => 'sales'
, pname => 'incremental_staleness'
, pvalue => 'null' );
END;



