Em 18 de dezembro de 2017 18:32, Fábio Telles Rodriguez < fabio.tel...@gmail.com> escreveu:
> vamos imaginar que a tabela 't' tem o campo 'id' que você quer remover as > 20 mil linhas: > > postgres=# create table t (id integer); > CREATE TABLE > postgres=# insert into t select * from generate_series(1,1500000); > LOG: temporary file: path "pg_tblspc/581531196/PG_9.3_ > 201306121/pgsql_tmp/pgsql_tmp29753.0", size 21000000 > INSERT 0 1500000 > > Agora vou criar uma tabela temporária que tenha 20 mil registros > aleatórios. Serão os registros que eu vou querer apagar da tabela 't' > > postgres=# create temporary table f (id integer); > CREATE TABLE > postgres=# insert into f select round(random()*1500000) from > generate_series(1,20000); > INSERT 0 20000 > > Agora eu faço o DELETE dos registros que escolhi: > > postgres=# delete from t where exists (select 1 from f where f.id=t.id); > DELETE 19866 > > Ou seja, eu prefiro fazer um SUBSELECT para apagar tudo. > > A minha tabela possui uma outra com históricos, então eu tenho o seguinte cenário: Tabela principal com 79 colunas, 1,5 milhões de registros e 596 MB de tamanho; Tabela de historico com 20 colunas, 10 milhões de registros e 1,2 GB de tamanho; Para excluir os registros da tabela principal, eu tenho que excluir primeiro na tabela de historicos, então eu excluí os 20 mil registros utilizando o operador "IN" e o delete foi rápido, porém, na tabela principal não, o campo utilizado no delete não é a PK mas um índice único. Será que pode ter ocorrido algum problema na tabela principal como um índice corrompido? No explain utilizando o "IN" eu tenho: Delete on tabela_a (cost=25.50..96449.56 rows=20059 width=6) Utilizando o método proposto pelo Telles eu tenho: Delete on tabela_a (cost=356.43..1324.56 rows=843680 width=12) []s Danilo
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral