我使用 AWS 管理的 Aurora PostgreSQL v15 实例作为大量 S3 对象的目录。该level1_dataset
表约有 20 亿行,其架构有一个metadata
JSONB 列。一个旧的软件错误导致在不应该写入元数据时将字符串null
写入列(而不是将其保留为空)。metadata
大约十亿行包含刺null
,我想用以下方法清理它:
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "metadata"::text = 'null';
该数据库托管在db.r6g.2xlarge
具有 8 个 vCPU 核心和 64 GB 内存的计算机上。通过此设置,并将所有调整保留为默认值,我得到了大约 42 秒/百万行。可以为此清理任务临时更改 CPU 核心和内存。
最有效的方法是什么?
更新:@laurenz-albe 的方法之一是分批进行。我就是这样做的,因为就我而言,“id”是 UUID,而不是整数。在我的用例中,SELECT 有 10% 的损失。
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "id" IN (SELECT "id"
FROM public.level1_dataset
WHERE "metadata"::text = 'null'
LIMIT 10000000);
最快的方法可能是
但这需要你抽出时间。
除此之外,批量更新和
VACUUM
更新之间: