我正在使用由 AWS Aurora Serverless v2 托管的 PostgresSQL 15。我有一个包含 2 亿行的表,我需要在该表上创建一个索引。问题是创建索引需要几个小时,这会影响生产环境中该表的常规操作。我不想为此更改数据库实例容量。
我正在寻找一种缓慢创建索引的方法。我不介意需要几天或几周的时间。就像我制作一个在后台运行的脚本,将数据慢慢地逐块放入新索引中。可以做到吗?
create index concurrently
并且可以减少执行此操作的会话的 max_parallel_workers
,使其不超过一个 CPU。两者都会使整个过程变慢,但除此之外您无能为力。
如果您分享了 DDL 并详细说明了“影响”的含义以及您能承受多少影响,那么想出一些东西会更容易。例如,如果这是一个分区表,则在其上创建索引会在所有分区上触发相同的操作 - 在这种情况下,您可以“手动”一一创建单独的分区索引。 create index
文档中提到了
:
当前不支持分区表上索引的并发构建。但是,您可以同时在每个分区上单独构建索引,然后最终非并发地创建分区索引,以减少对分区表的写入被锁定的时间。在这种情况下,构建分区索引只是元数据操作。ONLY
指示如果表已分区,则不要在分区上递归创建索引。默认是递归。