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