Eu sou novo no postgres,
Eu tenho uma tabela de 20 milhões de linhas que está em um servidor ativo - preciso remover a maioria das linhas, mas não todas. Eu quero fazer isso sem afetar outros processos de leitura/gravação que acessam esta tabela (com muita frequência).
Eu tenho uma maneira de excluir cerca de 100 a 400 mil blocos de linha por vez. Entre cada exclusão, quero suspender a consulta - para que outras operações possam ter a chance de acessar esta tabela.
Eu tenho o código, mas acredito nessa versão, ele trava a tabela o tempo todo que a query roda (com todas as sleeps). Como posso realmente liberar a tabela enquanto o processo dorme? Obrigada!!
Meu código até agora:
CREATE SEQUENCE tmp_sq increment by 1 minvalue 1 maxvalue 53 start with 1;
DO $$
DECLARE
w_counter integer;
BEGIN
w_counter := (SELECT nextval('tmp_sq'));
while w_counter < 53 loop
raise notice 'Value: %', w_counter ;
w_counter := (SELECT nextval('tmp_sq'));
-- this way of breaking up the delete into chunks works for my table because of dates.
delete from table_a where date_part('week',my_date) = w_counter;
raise notice ' Rows Were Deleted ';
--sleep
raise notice 'Sleeping Now.....';
perform pg_sleep(60);
end loop;
END $$;
A tabela em si é bloqueada apenas no modo ROW EXCLUSIVE, o que não deve impedir nenhuma operação normal na tabela, apenas coisas como DROP, ALTER e CREATE INDEX.
Cada linha individual que está sendo excluída será bloqueada pela duração. Isso só deve bloquear outros processos se esses outros processos estiverem tentando atualizar as linhas (ou excluí-los). Normalmente, com exclusões em massa, você exclui linhas com as quais ninguém mais se importa, o que significa que ninguém mais tentará atualizá-las.
Se você realmente precisar desbloquear todas as linhas excluídas e a tabela periodicamente, precisará fazer cada loop das exclusões em uma transação separada. Não há uma maneira fácil de fazer isso em um bloco DO porque o bloco inteiro é executado em uma única transação. Portanto, você deve colocar seu loop fora do PostgreSQL, como em bash, perl, python, etc.