2012/1/18, Marcelo Silva (IG) <[email protected]>:
> 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
>


Repare que no comando que estava demorando:
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'))

a cláusula FROM não se refere à tabela sendo atualizada mas a uma
"cópia" desta tabela (com alias a). Normalmente se usa este tipo de
construção quando se deseja uma auto-junção.

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

Responder a