So para comparação esse um update com inner join no mysql fica assim update tabela a inner join tabela b on(b.key = a.key) set campo = b.valor
Ou seja totalmente diferente :) -----Mensagem Original----- From: Osvaldo Kussama Sent: Wednesday, January 18, 2012 3:02 PM To: Marcelo Silva (IG) ; Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Por que este UPDATE está loopando? 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
