截断具有许多子分区的表需要很长时间

Posted

技术标签:

【中文标题】截断具有许多子分区的表需要很长时间【英文标题】:Truncating a table with many subpartitions taking too long time 【发布时间】:2021-12-23 21:03:33 【问题描述】:

我们有一项工作,每晚从源数据库加载一些表到目标数据库,其中许多是按范围或列表分区的。在加载一个表之前,我们首先将其截断,由于某种原因,这个过程对于特定表来说需要很长时间。

例如,TABLE A 有 6200 万行,并已按列表(BRANCH_CODE 列)进行分区。分区数为 213。截断此表需要 20 秒。

TABLE B 有 1700 万行,由DAY 列进行范围分区,间隔为月,每个分区按列表(BRANCH_CODE 列)有 213 个子分区。所以在本例中,分区数为 60,子分区数为 12780。截断此表需要 15 分钟。

是long truncate process 分区太多的原因吗?或者我们可能错过了一些表格规范,或者我们应该为表格设置特定的存储参数?

【问题讨论】:

您是否测试过 insert to temp、drop purge、create ? 你会截断整个表格吗?或者你截断分区或子分区?它看起来像一个奇怪的设计。当您分区或子分区时,您可以独立处理这些段。如果要截断整个表,为什么会有这么多分区和子分区? @AliFidanli ,您的意思是通过将表内容插入另一个没有分区的临时表,删除目标表然后创建为选择来测试它吗? 如果是这种情况,并且查询正在使用分区修剪,那么设计是有意义的,而不是人口。也许只截断上个月的分区会好很多,一种增量的方法 @Sherzodbek,这正是我的意思。您始终可以使用 alter table truncate partition 语句的子句更新索引。阅读有关它的文档 【参考方案1】:

手动收集固定对象和数据字典统计信息可能会提高支持截断 12,780 个对象所需的元数据查询的性能:

begin
    dbms_stats.gather_fixed_objects_stats;
    dbms_stats.gather_dictionary_stats;
end;
/

上述命令可能需要几分钟才能完成,但您通常只需在系统中的对象数量发生重大变化后运行一次。添加 12,780 个子分区可能会导致类似这样的奇怪问题。 (在调查这些问题时,您可能还想检查与如此多的子分区相关的空间开销。创建如此多的分区时很容易浪费许多 GB 的空间。)

【讨论】:

以上是关于截断具有许多子分区的表需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

postgres 截断很慢

如何改进 cube js preagregations 创建过程? (即使有分区粒度,构建 preggs 也需要很长时间)

Spark - 加载许多小 csv 需要很长时间

Java更新100条记录在一定时间后需要很长时间

Postgresql 选择计数查询需要很长时间

使用 form-repeater 在填充的表中添加新行需要很长时间(10-15 秒) - jQuery