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