Estou usando uma instância Aurora PostgreSQL v15 gerenciada pela AWS como catálogo para um grande número de objetos S3. A level1_dataset
tabela possui cerca de 2 bilhões de linhas e seu esquema possui uma metadata
coluna JSONB. Um bug de software antigo fazia com que a string null
fosse gravada na metadata
coluna (em vez de deixá-la vazia) quando nenhum metadado deveria ser gravado. Cerca de um bilhão de linhas contêm a picada null
e quero limpá-la com:
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "metadata"::text = 'null';
O banco de dados está hospedado em um sistema db.r6g.2xlarge
com 8 núcleos vCPU e 64 GB de memória. Com essa configuração, e deixando todos os ajustes nos padrões, estou obtendo cerca de 42 segundos/milhão de linhas. É possível alterar temporariamente os núcleos da CPU e a memória para esta tarefa de limpeza.
Qual é a maneira mais eficiente de proceder?
ATUALIZAÇÃO: Uma das abordagens de @laurenz-albe é fazer isso em lotes. Foi assim que fiz porque, no meu caso, “id” é UUID, não inteiro. O SELECT tem uma penalidade de 10% no meu caso de uso.
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "id" IN (SELECT "id"
FROM public.level1_dataset
WHERE "metadata"::text = 'null'
LIMIT 10000000);