oracle 在大表上收集统计信息

f8rj6qna  于 2023-03-07  发布在  Oracle
关注(0)|答案(1)|浏览(182)

我们有一个非常大的表,几乎有800亿条记录,有一个哈希paritition。任何建议如何收集此表上的统计数据,因为它需要一个星期才能完成或失败之间的快照太旧的错误。
我正在使用以下参数收集统计信息:

BEGIN  dbms_stats.gather_table_stats(ownname => ABC'  tabname =>'table1',  estimate_percent => 
DBMS_STATS.AUTO_SAMPLE_SIZE, 
cascade => DBMS_STATS.AUTO_CASCADE,  method_opt => 'FOR ALL COLUMNS SIZE AUTO',  degree => 
DBMS_STATS.DEFAULT_DEGREE); 
END;

Oracle版本:Oracle数据库19 c企业版发行版19.0.0.0.0 -生产版19.17.0.0.0

hfsqlsce

hfsqlsce1#

您可以使用各种速度调整:(1)降低估计百分比,(2)显式使用并行性,(3)请求块采样,(4)绕过索引,以及(5)通过在所有列上设置SIZE 1来禁止直方图:

BEGIN  
  dbms_stats.gather_table_stats(ownname => ABC'  
                                tabname =>'TABLE1',  
                                estimate_percent => 0.1, 
                                block_sample => true,
                                cascade => false,  
                                method_opt => 'FOR ALL COLUMNS SIZE 1',  
                                degree => 16); 
END;

显然,您必须参考自己的数据库硬件规模来确定适当的并行度。有些系统可以处理更多,有些则更少。
我发现在大型表中,百分比远低于1%,比如0.1%就可以了,比1快10倍,而1比默认值快100倍(100).块抽样 * 可能 * 导致一些不正确的结果,如果你的数据是严重偏斜的,你用了一个很小的百分比(如0.001%),但在许多情况下,它在0.1%或更高的百分比水平上是可以的,并且它确实通过随机选取块而不是行来加快速度,这减少了需要读取的块的数量。而且通常它们是不需要的。如果你后来发现你确实需要某个特定列上的直方图来支持一个特定的重要应用SQL,而这个应用SQL因为缺少直方图而变得一团糟,那么你可以只在那个列上显式地请求SIZE AUTO,但将所有其他值保持为1。直方图需要很长时间来收集,因此最好根据需要将其最小化。

相关问题