提问人:user3646666 提问时间:10/3/2023 更新时间:10/3/2023 访问量:111
Oracle 19c 增量统计奇怪行为
Oracle 19c Incremental Statistics Strange Behaviour
问:
我有一个有 2100 个分区的大桌子。数据每天都会加载到此表中,但我不知道数据将进入哪个分区。但是,平均而言,每天大约有 6-7 个分区接收数据。
我正在尝试获取此表上的增量统计信息。但是,Oracle 会始终如一地收集表的所有分区的统计信息。预期的行为是 Oracle 仅收集具有已更改数据的分区的统计信息。
此外,当我尝试在不执行任何操作的情况下收集同一表上的统计信息时,即使没有加载数据,它仍然会收集所有分区的统计信息。
我有其他类似的表格,没有问题。此行为对于一个表是唯一的。下面,我将分享我为此表配置的一些参数以及我如何收集统计信息。我是否应该调查其他参数来防止这种行为?或者,为什么 Oracle 会表现出这种行为?
APPROXIMATE_NDV_ALGORITHM ->HYPERLOGLOG
INCREMENTAL_STALENESS ->USE_STALE_PERCENT
GRANULARITY ->PARTITION
INCREMENTAL ->TRUE
PUBLISH ->TRUE
dbms_stats.gather_table_stats
(
ownname => 'TABLE_OWNER',
tabname => 'TABLE_NAME',
estimate_percent => 1,
degree => 32
);
答:
1赞
Paul W
10/3/2023
#1
我发现必须设置以下内容才能使增量统计信息正常工作:
GRANULARITY => 'AUTO'
INCREMENTAL => TRUE
PUBLISH => TRUE
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE
APPROXIMATE_NDV_ALGORITHM => 'HYPERLOGLOG'
INCREMENTAL_LEVEL => 'PARTITION'
把你搞砸的关键可能是 和 .这一定是因为 Oracle 会在表级别收集一次,然后根据需要收集分区,并且它必须能够自己做出此决定。越来越多的 Oracle 要求这两者都能够实现高级统计信息收集功能。您应该在表级别使用 进行设置,然后在调用 gathering 时,除了标识表之外不提供任何选项。granularity
estimate_percent
AUTO
AUTO
dbms_stats.set_table_prefs
评论
0赞
user3646666
10/3/2023
感谢您的反馈。但是,我已经按照您的建议进行了尝试,但统计数据仍在以同样的方式收集。我做过很多次尝试。
0赞
Paul W
10/4/2023
@user3646666 - 您是否删除了统计信息以重新开始,如我上面所示收集(第一次将是所有分区的完整收集),然后将数据加载到新分区中,然后重新收集?在测试过程中,如果不填充或显著更改分区,则无法对其进行测试。还要记住,增量统计信息与仅在最近的分区上收集不同。Oracle 总是基于过时性来做到这一点,而陈旧性是由 .Incremental 使用近似值计算全局统计信息,而无需进行全局扫描。dba_tab_modifications
0赞
Paul W
10/4/2023
@user3646666 - 您是否正在检查“HYPERLOGLOG”?您还可以通过查询来检查概要,但您必须将其加入 。归根结底,您要寻找的是表级别(而不是分区级别),以显示更新的 low_value/high_value/num_distinct/last_analyzed,即使收集只命中一个分区。这是增量统计数据。此外,where (全局表级别) 应随着新分区的添加和收集而增加dba_tab_col_statistics.notes
SYS.WRI$_OPTSTAT_SYNOPSIS_HEAD$
dba_objects
dba_tab_col_statistics
dba_tab_statistics.num_rows
partition_name is null
0赞
user3646666
10/4/2023
“您是否删除了统计数据以重新开始,如我上面所示的收集(第一次将是所有分区的完整收集),然后将数据加载到新分区中,然后重新收集?”我已经做到了。现在没有问题了。谢谢!
评论