Em 15 de abril de 2011 10:19, Thiago <[email protected]> escreveu:
> Pessoal, bom dia.
>
> Eu confesso que não entendo muito sobre índices no postgre, mas imagino
> qual seja o problema.
>
> Tenho uma tabela de movimentação onde o campo código do produto está no
> tipo Real e tenho o seguinte select:
>
> select codigo,sum(qtd)
> from vendas
> where codigo in (1,2,3) and data between '01/01/2010' and '31/12/2010'
> group by codigo
>
> Quando eu rodo o select dessa forma roda super rápido, pois acho que ele
> utiliza os indices, porem quando executo o select utilizando o in em um
> subselect ele é super lento. Acontece que o campo código da outra tabela
> é do tipo Integer. Esse seria o select:
>
> select codigo,sum(qtd)
> from vendas
> where
>    codigo in (
>       select codpro
>       from tabelafoo
>    ) and
>    data between '01/01/2010' and '31/12/2010'
> group by codigo
>
> (corte)

Xará, eu não arriscaria dizer que existe apenas uma solução. Às vezes
a opção mais óbvia não se mostra a mais rápida. Mas eu diria quase
como uma regra, substituir o "IN" por "EXISTS" pode lhe dar resultados
muito mais rápidos.

Tente uma das duas alternativas:

#1
SELECT
        v.codigo,
        sum(v.qtd) AS foocolumn
FROM
        vendas v JOIN tabelafoo t ON
                v.codigo = t.codpro
WHERE
        v.data BETWEEN '01/01/2010' and '31/12/2010'
GROUP BY
        v.codigo

#2      
SELECT
        v.codigo,
        sum(v.qtd) AS foocolumn
FROM
        vendas v
WHERE
        EXISTS(
                SELECT
                        1
                FROM
                        tabelafoo t
                WHERE
                        t.codpro = v.codigo
        ) AND
        v.data BETWEEN '01/01/2010' and '31/12/2010'
GROUP BY
        v.codigo


-- 
TIAGO J. ADAMI
http://www.adamiworks.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a