Resultado com Explain no update errado

Update on mv_vendas_itens  (cost=1469.85..2114.64 rows=616 width=109)
  ->  Nested Loop  (cost=1469.85..2114.64 rows=616 width=109)
        ->  Merge Join  (cost=1469.85..1612.30 rows=1 width=16)
              Merge Cond: ((a.valor_ven = b.valor_ven) AND (a.cod_id = 
b.cod_id) AND (a.pedido = b.pedido) AND ((a.codigo)::text = (b.codigo)::text))
              ->  Sort  (cost=691.57..701.78 rows=4082 width=22)
                    Sort Key: a.valor_ven, a.cod_id, a.pedido, a.codigo
                    ->  Seq Scan on mv_vendas_itens a  (cost=0.00..446.76 
rows=4082 width=22)
                          Filter: ((obs <> 'C'::bpchar) AND (cod_key_pre = 0))
              ->  Sort  (cost=778.27..796.58 rows=7322 width=26)
                    Sort Key: b.valor_ven, b.cod_id, b.pedido, b.codigo
                    ->  Seq Scan on mv_vendas_pre_itens b  (cost=0.00..308.27 
rows=7322 width=26)
                          Filter: (obs <> 'C'::bpchar)
        ->  Seq Scan on mv_vendas_itens  (cost=0.00..391.17 rows=11117 width=93)


Mas depois da dica do Osvaldo o update está assim

update mv_vendas_itens a set cod_key_pre = coalesce(b.cod_key, 0)
from mv_vendas_pre_itens as b
where (b.cod_id = a.cod_id)
and(b.pedido = a.pedido)
and(b.codigo = a.codigo)
and(b.valor_ven = a.valor_ven)
and(b.obs not in('C'))
and(a.obs not in('C'))

E funcionou belesminha


From: JotaComm 
Sent: Wednesday, January 18, 2012 2:19 PM
To: Marcelo Silva (IG) ; Comunidade PostgreSQL Brasileira 
Subject: Re: [pgbr-geral] Por que este UPDATE está loopando?

Opa,


Em 18 de janeiro de 2012 13:27, Marcelo Silva (IG) <marc...@ig.com.br> escreveu:

  Pessoal esse UPDATE esta sem fim... mas não entendi porque o mesmo SQL 
funciona normalmente

  Olha o UPDATE

  update mv_vendas_itens set cod_key_pre = coalesce(b.cod_key, 0)
  from mv_vendas_itens as a
  inner join mv_vendas_pre_itens b on(b.cod_id = a.cod_id)
  and(b.pedido = a.pedido)
  and(b.codigo = a.codigo)
  and(b.valor_ven = a.valor_ven)
  and(b.obs not in('C'))
  where (a.obs not in('C'))

  Aqui o SELECT

  select b.cod_key, b.pedido, b.codigo, b.valor_ven, a.* from mv_vendas_itens a
  inner join mv_vendas_pre_itens b on(b.cod_id = a.cod_id)
  and(b.pedido = a.pedido)
  and(b.codigo = a.codigo)
  and(b.valor_ven = a.valor_ven)
  and(b.obs not in('C'))
  where (a.obs not in('C'))

  O Select vem rapidinho, mas o Update fica em loop

Update em loop ou extramemente lento?

Qual o resultado do EXPLAIN? 




  Marcelo Silva
  --------------------------------------------------
  Desenvolvedor Delphi, PHP
  msn: marc...@ig.com.br
  cel.: (11) 9693-4251

  _______________________________________________
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




Abraços
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a