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

Responder a