POSTGRESQL 13 可以并行VACUUM INDEX 你知道对吧

本文详细介绍了PostgreSQL 13版本中引入的并行VACUUM功能,特别是针对索引整理的并行优化。通过参数调整如`max_parallel_maintenance_workers`、`maintenance_io_concurrency`,可以提升VACUUM操作的效率。作者通过实际测试展示了不同并行度下VACUUM操作的时间消耗,证明并行处理对于大量索引的表具有显著的性能提升。测试结果显示,适当增加并行度可以显著缩短VACUUM的时间,尤其是在2个并行工作线程时效果最佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fb44b9d0ea197793e64b643385c0c4d9.png

POSTGRESQL 我们在大量的使用,但实话实话知识的更新永远是滞后的,VACUUM 是可以并行进行INDEX 的操作,这个事情是在 POSTGRESQL 13 的这个版本上被实现的。

实际上POSTGRESQL 经常被其他数据库专家攻击的部分,有2个。 一个是我们熟知的 BF 问题,一个就是经常被提到的 Vacuum 问题。如果POSTGRESQL 解决了这两个问题,则其他数据库专家对POSTGRESQL 的口诛笔伐将失去源泉。

为什么是POSTGRESQL 13,因为postgresql 从13的这个版本针对VACUUM 的操作提供了更多的有效管理的方法。今天就要提的是POSTGRESQL VACUUM 的并行索引整理的功能。

这里分为两个部门

1 参数调整

cc1a7bcca73d09b8800d8b6441beadd9.png

max_parallel_maintenance_workers ,这个命令主要的提高了  maintenance_workers 工作中使用并行方式的可能,这里包含了 create index , vacuum 中不带有full的选项。所以在有适当的maintenance_work_mem 的情况下,以及冲去的 max_work_processes 的情况下,还可以继续调整 maintenance_io_concurrency 的值来增加在进行如上操作中,进行并行的可能性。

实际上这些值需要进行测试和验证,以在实际的工作场景中获得更多的有效的工作性。

所以基于参数的调整中,我们针对VACUUM 命令的执行中的并行性有了更多的可能性。

在我们操作POSTGRESQL 对表进行vacuum 操作中可以自动添加新的参数来增加进行vacuum 的并行的可能性。如

5f9c04b49236b517fb2c6b8bb0273e00.png


通过上图可以看到 vacuum (parallel 4) t_test; 通过传统的vacuum 命令中添加PG 13 独有的 parallel + 并行数可以激活针对索引的并行整理的工作,实际上 VACUUM  ,autovacuum的工作中,一大部分的工作并不是针对表本身,而是索引消耗了大量的VACUUM 工作的时间。

所以PG13 在这个部分针对索引对VACUUM 工作中的消耗的问题,提出了并行的方式来进行处理。

那么我们可以做一个相关的测试,来看看打开和不打开并行的工作VACUUM 的工作时间之间的不同,以及在整理中对于性能的影响的问题。

7240d5f9c696d357b8eb3067eaef4a2f.png

这里我们产生一个大表,并针对这个表进行相关的VACUUM 手动的工作来看看并行是否对于整理VACUUM 有时间的节省。

这是一张5000万的表,我们针对表中的字段进行了索引的添加。同时我们还要针对这个表进行UPDATE 的操作,产生死的元组。

0c7a3651b3993b8e2a8e7cccb5dbbef8.png

我们针对表进行UPDATE 操作

update t_test set name = '1',address = '222222' where id > 567800 and id < 9000000;

fd7363a9242c90c7b11bf52aff4756e4.png

后面我们将针对这个表,持续使用这个UPDATE 的语句,来进行使用并行和不使用并行的VACUUM 操作的对比工作。

1  采用了 8个并发的方式来进行VACUUM 工作

86b330368f015f92ebe0ec16e150e2ed.png

上面的图是进行VACUUM 操作时的系统消耗,下面的图是工作的时间,这里28秒完成了 VACUUM 的操作。

3830018371256c57585395606e5d3172.png

才买我们调整线程数,看看降低一半会有什么情况发生,首先还执行刚才的UPDATE 语句,然后将并行索引优化的的参数从 8 降低到 4 .

fea497081afc6f42eda34e0b9207ed45.png

操作中使用的时间变成  27秒,同时通过NMON 观察系统CPU 的消耗的图形。

77c9418f5e2b0cd8a0466967cc29749a.png

可以说此时使用 8 核心还是 4 核心,之间的差距并不大。我们在将并发调整到 2 看看针对 8 和 4 有什么不同。

8da304b5ee1f8b5b893fb2bdd2e7ecfc.png

在将并行降低到 2 后,工作时间变为21秒,比 8 和 4 核心分别低了 7 秒和 6秒。 

那么我们继续将并行关闭,看看工作的时间和系统的负载是多少。

cba4a6c9f9306eccbe91a963882f8c03.png

d1a0ab0eeff6cb42d34bf53f55b36764.png

操作中整体的操作整体的时间为 58秒,对比之前并行的操作中,2个并行效果是最好的,对比不开并行和开了并行 2核心,时间消耗为 2倍。

这就证明开启并行,针对不开启并行的VACUUM 命令针对索引过多的POSTGRESQL 的表来说,是有帮助的。

在测试中,测试了几种不同的并行度其中主要包含这两个参数

 -j, --jobs=NUM    use this many concurrent connections to vacuum

-P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available

这里主要调节的是  -j   使用多少连接去进行vacuum   -P 多少并行的 works 针对索引同时进行vacuum操作。

下面是一个测试的列表的结果的数据

PG 的物理机  8 CORE  16G  

1  8 JOB  8 parallel  28 秒

2  4 JOB  4 parallel  27 秒

3  2 JOB  2 parallel  21 秒

4  1 JOB  1 parallel  58 秒

5  2 JOB  4 parallel  33 秒

6  1 JOB  2 parallel  21 秒

通过测试,发现针对 JOB 的调整对于索引较多的表,改善并不明显,而适当调整针对索引的并行,有利于缩短vacuum的过程。具体的命令可以使用外部的命令来进行批量的测试。

vacuumdb -d postgres -e -j 1 -P 2 -t t_test -v

8f1e08d2bdbb0d001754d8cb525808f8.png

<think>好的,用户现在问的是“vacuum可以与ddl并行运行吗”,我需要先回忆一下PostgreSQL的相关知识。首先,用户之前的问题是关于多列索引的支持类型,现在转向了vacuum和DDL的并发执行,这可能是在数据库维护和结构变更时遇到的问题。 首先,我需要明确vacuum和DDL各自的作用。VacuumPostgreSQL用来回收死元组空间的过程,特别是自动vacuum(autovacuum)对于防止表膨胀非常重要。而DDL指的是数据定义语言,比如CREATE、ALTER、DROP等操作,用于修改数据库结构。 接下来,我需要确定在PostgreSQL中,当执行DDL操作时,是否会与正在运行的vacuum发生冲突。根据PG的文档,某些DDL操作会需要排他锁,这可能会阻塞其他操作,包括vacuum。例如,当执行ALTER TABLE时,会获取一个ACCESS EXCLUSIVE锁,这会阻止vacuum对该表的操作,直到DDL完成。 然后,要考虑不同版本的PostgreSQL是否有不同的行为。比如,在较新的版本中,是否有改进允许更多的并发操作。比如,某些DDL可能只需要较低的锁级别,或者vacuum是否有机制可以绕过某些锁。 另外,用户可能实际应用场景是在进行数据库维护时,同时进行结构变更,这时候需要知道是否可以并行执行,以避免长时间停机。例如,在系统运行期间,自动vacuum是否会被DDL阻塞,导致空间无法及时回收,或者反过来,DDL是否会被正在进行的vacuum延迟,影响上线时间。 还需要考虑用户可能的误解,比如是否认为所有的DDL都不能与vacuum并行,或者是否有一些特定情况可以。因此,在回答时需要分情况讨论,哪些DDL可以,哪些不可以,以及可能出现的锁冲突情况。 可能还需要举一些例子,比如创建索引的CONCURRENTLY选项是否允许与vacuum同时运行,或者truncate table这种DDL是否需要排他锁,从而阻塞vacuum。 最后,需要总结建议,比如在DDL操作期间监控锁状态,避免长时间阻塞,或者推荐在低峰期进行DDL操作以减少影响。</think>以下是 PostgreSQLVACUUM 与 DDL 操作的并行执行规则详解: ```sql -- 查看当前锁状态(验证锁冲突) SELECT * FROM pg_locks WHERE relation = 'your_table'::regclass; ``` ### 一、并行执行基本原则 | 操作类型 | 所需锁级别 | 与 VACUUM 并行可能性 | |-----------------|----------------------|---------------------| | 普通 VACUUM | SHARE UPDATE EXCLUSIVE | 允许并行 DML | | VACUUM FULL | ACCESS EXCLUSIVE | 完全阻塞所有操作 | | CREATE INDEX | SHARE | 可能冲突 | | CREATE INDEX CONCURRENTLY | SHARE UPDATE EXCLUSIVE | 可并行 | | ALTER TABLE | ACCESS EXCLUSIVE | 完全互斥 | | DROP TABLE | ACCESS EXCLUSIVE | 完全互斥 | | TRUNCATE | ACCESS EXCLUSIVE | 完全互斥 | ### 二、关键场景分析 1. **普通 VACUUM 与 DDL 交互**: ```sql -- 当执行以下操作时会阻塞 VACUUM: ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- 需要 ACCESS EXCLUSIVE -- 允许并行的 DDL 示例: CREATE INDEX CONCURRENTLY idx_name ON users(name); -- 使用 SHARE UPDATE EXCLUSIVE ``` 2. **VACUUM FULL 的特殊性**: ```sql VACUUM FULL orders; -- 获得 ACCESS EXCLUSIVE 锁 -- 此时任何 DDL 操作都会进入等待: ALTER TABLE orders ADD COLUMN discount NUMERIC; ``` 3. **自动 vacuum 与 DDL 的竞争**: ```sql -- 通过参数调节避免冲突: ALTER SYSTEM SET autovacuum_vacuum_cost_delay =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值