2009/8/4 paulo matadr <[email protected]>

> Olha pessoal,
> Eu to com esse delete na maior tabela do meu banco:
> delete from cobranca_documento_item where cnta_id in  (select cnta_id from
> conta_geral where cntg_ichistorico=3)
> que ta  sendo muito custoso para nosso ambiente,no analyze
> Hash IN Join  (cost=444791.95..11042547.76 rows=1390453 width=6)
>   Hash Cond: (cobranca_documento_item.cnta_id = conta_geral.cnta_id)
>   ->  Seq Scan on cobranca_documento_item  (cost=0.00..5242127.64
> rows=245865664 width=10)
>   ->  Hash  (cost=438290.02..438290.02 rows=373994 width=4)
>         ->  Bitmap Heap Scan on conta_geral  (cost=7278.42..438290.02
> rows=373994 width=4)
>               Recheck Cond: (cntg_ichistorico = 3)
>               ->  Bitmap Index Scan on xix1_conta_geral
> (cost=0.00..7184.92 rows=373994 width=0)
>                     Index Cond: (cntg_ichistorico = 3)
>
> Estrutura:
> -Fk de cobranca_documento_item pra conta_geral ligando os campos cnta_id
> -Index para  cnta_id em  cobranca_documento_item(nao usando neste explain)
> -cnta_id em conta_geral é uma pk
> -Index para cntg_ichistorico em  conta_geral( xix1_conta_geral)
>
> Existe uma maneira de fazer um delete mais otimizado n qual nao haja
> seqscan em cobranca_documento_item ?
>
>

Podes tentar:

DELETE
   FROM cobranca_documento_item
 WHERE EXISTS (SELECT 1 FROM conta_geral WHERE conta_geral.cnta_id =
cobranca_documento_item.cnta_id AND conta_geral.cntg_ichistorico = 3);

Também podes utilizar a cláusula USING [1] no teu delete para fazer uma
junção com a tabela "conta_geral".

[1] http://www.postgresql.org/docs/8.4/interactive/sql-delete.html


Cordialmente,

-- 
Fabrízio de Royes Mello
>> Blog sobre PostgreSQL: http://fabriziomello.blogspot.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a