首页 > 数据库 > 数据库开发技术 > 8大vacuum实用技巧助您轻松管理数据库
欢迎关注公众号, 持续发布PostgreSQL、openGauas/MogDB等PG系数据库干货文章。
PostgreSQL在线表清理是由autovacuum进程完成,计划内的autovacuum操作有资源管控限制。部分业务场景(例如批量更新),还需及时手工调用vacuum命令或vacuumdb工具来进行一些更为灵活的操作。
本文介绍vacuum的如下8个进阶功能:
同时指定多个表
跳过被锁住的表
跳过索引清理
并行清理索引
配置内存用量
快捷清理TOAST表
解藕更新统计信息
schema级按需清理
从PostgreSQL 11开始,vacuum命令支持同时指定多个表进行操作:
postgres=# VACUUM tab1, tab2;
VACUUM
从PostgreSQL 12开始,vacuum命令可以跳过被锁住的表,使操作能够执行完成而不会一直处于等待状态。
postgres=# VACUUM (SKIP_LOCKED) foo;
WARNING: skipping vacuum of "foo" --- lock not available
VACUUM
使用SKIP_LOCKED选项后,可看到一条表被锁住跳过执行的警告信息。
很多场景下索引的清理往往占大头,PostgreSQL 12里表和索引的清理操作支持解耦,允许vacuum命令显式设置INDEX_CLEANUP选项,语法参考如下:
VACUUM (VERBOSE, INDEX_CLEANUP off) foo;
假如有一个带有很多索引的表,我们计划对该表重建索引。操作之前,可以先单独清理表,否则常规操作会同时清理索引。
从PostgreSQL 13开始,索引清理在单表上支持并行操作,每个索引都可以分配一个工作清理进程。它的使用语法参考如下:
VACUUM (PARALLEL 8) foo;
并行度可以简单的按CPU的核数进行设置,充分利用CPU,提高清理效率。
在PostgreSQL 16里,vacuum命令可以使用BUFFER_USAGE_LIMIT选项控制内存使用量。参考语法如下:
VACUUM (BUFFER_USAGE_LIMIT 0) foo;
针对大表的清理操作使用该选项,设置为0,允许使用所有shared buffer,最大化利用buffer cache。
数据行受限于不能跨page存储,因而每个table可能会有一个与之关联且隐藏的TOAST表。
在PostgreSQL 16里,vacuum命令可以使用PROCESS_MAIN选项只处理主表数据,或者设置为false只处理附属的TOAST表。参考语法如下:
VACUUM (PROCESS_MAIN false) foo;
PROCESS_MAIN选项设置为false,可以通过主表来快捷清理TOAST表,否则需要从pg_class表进行关联查询获取TOAST表的名称。
vacuum命令如果操作的表很多, 每次清理更新数据库维度的统计信息性能会很差。
PostgreSQL 16里可以使用SKIP_DATABASE_STATS选项暂不更新统计信息,等所有表清理完成之后再使用ONLY_DATABASE_STATS选项统一操作。
例如下面在清理表时都使用SKIP_DATABASE_STATS选项跳过更新统计信息。
VACUUM (SKIP_DATABASE_STATS) tab1;
VACUUM (SKIP_DATABASE_STATS) tab2;
...
最后再只做一次更新统计信息的操作。
VACUUM (ONLY_DATABASE_STATS)...
多租户场景下,在PostgreSQL 16里,vacuumdb工具可指定schema或排除schema来进行黑白名清理。
使用–schema选项只处理某些模式下的对象,例如:
$ vacuumdb --schema schema1 --schema schema2
使用–exclude-schema选项跳过处理某些模式下的对象,例如:
$ vacuumdb --exclude-schema schema1 --exclude-schema schema2
本文到此结束,希望这8个功能可以帮您更好的做好数据清理工作!
原文作者:象楚之行;如有侵权,请联系管理员删除。