Boa tarde.

Tenta montar o delete da seguinte forma:

DELETE FROM cobranca_documento_item cdi USING conta_geral cg
WHERE cdi.cnta_id = cg.cnta_id AND cg.cntg_ichistorico = 3;

Acho que fica melhor, pois evita executar um select para cada registro que 
deseja excluir.

Anderson Aguilar Ferreira


----- Original Message ----- 
From: "Fábio Telles Rodriguez" <[email protected]>
To: "Comunidade PostgreSQL Brasileira" <[email protected]>
Sent: Tuesday, August 04, 2009 2:31 PM
Subject: Re: [pgbr-geral] Res: Otimizacao delete


Em casos extremos eu recomendo usar o INSERT ao invés do DELETE:

http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/

Veja o que você acha....

[]s
Fábio Telles

2009/8/4 paulo matadr <[email protected]>:
> Seguinte,para a recomendação do osvaldo
> o explain da exatamente igual ao uso do IN.
> e para a recomendação do fabricio :
> 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);
> tenho um custo bem maior, e ainda uma estimativa de numero de linhas
> afetadas bem maior.
> --
> Seq Scan on cobranca_documento_item (cost=0.00..3953114915.19
> rows=122956952 width=6)
> Filter: (subplan)
> SubPlan
> -> Index Scan using conta_geral_pkey on conta_geral (cost=0.00..16.05
> rows=1 width=0)
> Index Cond: (cnta_id = $0)
> Filter: (cntg_ichistorico = 3)
>
> Acho que nao tem pra onde correr.
> abs
>
>
> ________________________________
> De: Osvaldo Kussama <[email protected]>
> Para: Comunidade PostgreSQL Brasileira 
> <[email protected]>
> Enviadas: Terça-feira, 4 de Agosto de 2009 11:47:46
> Assunto: Re: [pgbr-geral] Otimizacao delete
>
> 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 ?
>>
>
>
> Tente:
> DELETE FROM cobranca_documento_item USING conta_geral
> WHERE cnta_id = conta_geral.cnta_id AND conta_geral.cntg_ichistorico = 3;
>
> Osvaldo
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
> ________________________________
> Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 -
> Celebridades - Música - Esportes
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>



-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [email protected]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a