从Oracle Database 12c开始,增量统计信息可以自动计算分区表的全局统计信息,即使分区统计信息或子分区统计信息已过时并已锁定也是如此。
在Oracle Database 12c之前的版本中启用增量统计信息时,如果分区上发生任何DML,则优化器将认为该分区上的统计信息是陈旧的。因此,DBMS_STATS必须再次收集统计信息以准确汇总全局统计信息。此外,如果DML发生在其统计信息已锁定的分区上,则DBMS_STATS无法在该分区上收集统计信息,因此全表扫描是收集全局统计信息的唯一方法。收集统计信息会增加性能开销。
在Oracle Database 12c中,统计信息首选项INCREMENTAL_STALENESS控制数据库如何确定分区或子分区上的统计信息是否陈旧。此首选项采用以下值:
USE_STALE_PERCENT如果DML更改小于
STALE_PERCENT为表指定的首选项,则该分区或子分区不会被视为过时的。的默认值STALE_PERCENT是10,这意味着如果DML引起的行变化超过10%,则该表被视为失效。USE_LOCKED_STATS无论DML更改如何,锁定的分区或子分区统计信息都不会被视为过时的。
NULL(默认)如果分区或子分区具有任何DML更改,则认为它是陈旧的。此行为与Oracle Database 11g行为相同。使用默认值时,保证以增量方式收集的统计信息与以非增量方式收集的统计信息相同。使用非默认值时,以增量方式收集的统计信息可能不如以非增量方式收集的统计数据准确。
您可以一起指定USE_STALE_PERCENT和USE_LOCKED_STATS。例如,您可以编写以下匿名块:
BEGIN
DBMS_STATS.SET_TABLE_PREFS (
ownname => null
, table_name => 't'
, pname => 'incremental_staleness'
, pvalue => 'use_stale_percent,use_locked_stats'
);
END;假设条件
本教程假定以下内容:
- 在
STALE_PERCENT一个分区表被设置为10。 - 该
INCREMENTAL值设置为true。 - 该表以前以
INCREMENTAL模式收集过统计信息。 - 您想发现统计信息收集方式如何变化,具体取决于的设置
INCREMENTAL_STALENESS,统计信息是否被锁定以及DML的变化百分比。
要测试具有过期或锁定分区统计信息的表,请执行以下操作:
- 设置
INCREMENTAL_STALENESS到NULL。之后,由于DML活动,一个分区中5%的行发生了变化。
- 使用
DBMS_STATS收集表的统计信息。DBMS_STATS收集具有5%DML活动的分区的统计信息,并增量维护全局统计信息。 - 设置
INCREMENTAL_STALENESS到USE_STALE_PERCENT。之后,由于DML活动,一个分区中5%的行发生了变化。
- 使用
DBMS_STATS收集表的统计信息。DBMS_STATS确实不为过DML活动(因为变化是在10%的陈旧程度阈值)分区regather统计,并逐步维护全局统计信息。 - 锁定分区统计信息。
之后,由于DML活动,一个分区中20%的行发生了变化。
- 使用
DBMS_STATS收集表的统计信息。DBMS_STATS确实不 regather统计分区,因为统计数据被锁定。数据库通过全表扫描收集全局统计信息。之后,由于DML活动,一个分区中5%的行发生了变化。
- 使用
DBMS_STATS收集表的统计信息。当您在此表上收集统计信息时,请
DBMS_STATS不要收集该分区的统计信息,因为它们不会被视为过时的。数据库使用此分区的现有统计信息来增量维护全局统计信息。 - 设置
INCREMENTAL_STALENESS为USE_LOCKED_STATS和USE_STALE_PERCENT。之后,由于DML活动,一个分区中20%的行发生了变化。
- 使用
DBMS_STATS收集表的统计信息。因为
USE_LOCKED_STATS设置了,将DBMS_STATS忽略统计信息过时的事实,并使用锁定的统计信息。数据库使用此分区的现有统计信息来增量维护全局统计信息。
也可以看看:
Oracle Database PL / SQL软件包和类型参考以了解更多信息DBMS_STATS.SET_TABLE_PREFS




