>
> Não sei se entendi direito, mas ai vai uma dica:
>
>     select movie.c_cpd, sum(movie.n_cant + (movis.n_cant)*-1) as n_cant
> from movie
>        JOIN movis ON (movis.c_cpd = movie.c_cpd)
>         where movie.c_sucursal>='001' and movie.c_sucursal<='001'
>         group by movie.c_cpd
>
> Apenas é necessário validar se o join que montei é valido para seu
> escopo, olhando a estrutura do seu select acredito que seja.
> Isso fica bem mais rapido e bem mais simples.


Obrigado pela resposta, testei sua consulta, funcionou certinho.
Mas infelizmente, é muito mais lenta que a minha consulta.

Veja o explain: 14677.89 contra 6785.

GroupAggregate  (cost=14677.89..43425.50 rows=5904 width=30)
  ->  Merge Join  (cost=14677.89..36974.43 rows=1269551 width=30)
        Merge Cond: (movie.c_cpd = movis.c_cpd)
        ->  Index Scan using ind_cpd on movie  (cost=0.00..3191.92
rows=25397 width=18)
              Filter: ((c_sucursal >= '001'::bpchar) AND (c_sucursal <=
'001'::bpchar))
        ->  Materialize  (cost=14677.63..15940.63 rows=101040 width=18)
              ->  Sort  (cost=14677.63..14930.23 rows=101040 width=18)
                    Sort Key: movis.c_cpd
                    ->  Seq Scan on movis  (cost=0.00..4378.40 rows=101040
width=18)

Vale lembrar, que c_sucursal no ambiente que estou, em todos os registros
tem '001', portanto acho q nao se faz necesario uso de indice.. Mas haverá
outros ambientes que podem haver varias sucursais..
e tenho um indice para c_cpd. ajuda em algo:


-- 
*:-.,_,.-:*'``'*:-.,_,.-:*:-.,_,.-:*'``'*:-.,_,.-:
       :: Rodrigo Machado ::
           FlaRo Sistemas

         Linux User #338262
Lat S25º49'20.11' - Lon W55º07'12.05''
*:-.,_,.-:*'``'*:-.,_,.-:*:-.,_,.-:*'``'*:-.,_,.-:
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a