Estou carregando alguns dados em meu banco de dados postgres usando um script python. Esses dados estão todos em arquivos CSV enormes, então eu os leio preguiçosamente e chamo instruções INSERT em lotes de dados. No entanto, esses dados estão todos "conectados" de alguma forma, por isso é bom manter todo o pipeline de carregamento de dados como uma única transação, para que, se alguma parte dele falhar, tudo possa ser revertido.
Minha pergunta é: estou me esforçando para manter esses enormes arquivos csv fora da memória em meu script python, mas, como todo o carregamento de dados é uma única transação, todos os dados acabam na memória no lado do postgres das coisas? Uma única transação INSERT precisa acomodar todos os seus dados inteiramente na memória?
Não, mas deve caber no espaço disponível para arquivos WAL.
O PostgreSQL grava dados de transações não confirmadas no WAL e nos arquivos de dados como qualquer outro dado. Os dados não precisam ser mantidos na memória, nem os arquivos WAL precisam ser mantidos depois de arquivados e não contêm dados mais recentes que o último ponto de verificação. Então você não precisa se preocupar com isso.
Caso você esteja se perguntando como o PostgreSQL pode reverter uma transação grande se não tiver os dados dessa transação na memória: o PostgreSQL nunca executa realmente uma reversão. Se você executar
ROLLBACK
(ou um erro abortar a transação), tudo o que acontece é que a transação é marcada como "abortada" no log de commit , de modo que todos os dados que ela gravou ficam invisíveis. Os dados de uma transação abortada permanecem armazenados na tabela até que a próxima execução do autovacuum os remova.O risco de transações de longa duração no PostgreSQL é diferente:
você manterá os bloqueios por um longo tempo, o que é ruim para a simultaneidade e aumenta a probabilidade de conflitos
VACUUM
não é possível limpar nenhuma versão de linha que se tornou invisível após o início da transação de longa duração, o que pode levar ao inchaço da tabela se houver muita atividade DML simultânea