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
Esse subselect traz exatamente os mesmos código de quando eu coloco os
números separados por vírgula.
Eu acho que por serem tipos de campos diferentes ele não está utilizando
o índice da tabela de vendas.
Eu já tentei dando cast no subselect mas mesmo assim não adiantou.
Alguém saberia me ajudar?
Estou postando junto o Explain dos dois selects:
Rápido:
QUERY PLAN
Merge Left Join (cost=549053.15..549059.80 rows=150 width=62)
" Merge Cond: (""outer"".balconista = ""inner"".int_cod_balcao)"
-> Sort (cost=548990.82..548990.90 rows=30 width=20)
Sort Key: vnd.balconista
-> Sort (cost=548989.71..548989.78 rows=30 width=20)
Sort Key: n.movfilcom, n.movcodbal
-> HashAggregate (cost=548988.45..548988.97 rows=30
width=20)
-> Bitmap Heap Scan on stfil021_new n
(cost=45001.52..548869.49 rows=11896 width=20)
Recheck Cond: ((movdatmov >=
'2010-10-01'::date) AND (movdatmov <= '2011-03-30'::date))
Filter: ((movcodite = 44067::double
precision) OR (movcodite = 25372::double precision) OR (movcodite =
173207::double precision) OR (movcodite = 206857::double precision) OR
(movcodite = 206865::double precision) OR (movcodite = 43621::double
precision) OR (movcodite = 173193::double precision))
-> Bitmap Index Scan on stfil021_new_idx1
(cost=0.00..45001.52 rows=5121753 width=0)
Index Cond: ((movdatmov >=
'2010-10-01'::date) AND (movdatmov <= '2011-03-30'::date))
-> Sort (cost=62.33..64.83 rows=1000 width=46)
Sort Key: sp_com_lista_func.int_cod_balcao
-> Function Scan on sp_com_lista_func (cost=0.00..12.50
rows=1000 width=46)
Demorado:
QUERY PLAN
Merge Right Join (cost=274652.49..274795.49 rows=9200 width=62)
" Merge Cond: (""outer"".int_cod_balcao = ""inner"".balconista)"
-> Sort (cost=62.33..64.83 rows=1000 width=46)
Sort Key: sp_com_lista_func.int_cod_balcao
-> Function Scan on sp_com_lista_func (cost=0.00..12.50
rows=1000 width=46)
-> Sort (cost=274590.16..274594.76 rows=1840 width=20)
Sort Key: vnd.balconista
-> GroupAggregate (cost=274416.78..274471.98 rows=1840 width=20)
-> Sort (cost=274416.78..274421.38 rows=1840 width=20)
Sort Key: n.movfilcom, n.movcodbal
-> Nested Loop (cost=270727.12..274317.00
rows=1840 width=20)
-> HashAggregate (cost=2.20..2.21 rows=1
width=4)
-> Seq Scan on tb_com_camp_det d
(cost=0.00..2.20 rows=1 width=4)
Filter: (int_camp_cab = 22)
-> Bitmap Heap Scan on stfil021_new n
(cost=270724.92..274287.19 rows=1840 width=24)
" Recheck Cond: ((n.movcodite =
(""outer"".int_cod_prod)::real) AND (n.movdatmov >= '2010-10-01'::date)
AND (n.movdatmov <= '2011-03-30'::date))"
-> Bitmap Index Scan on
stfil021_new_idx_fil_ite_dat (cost=0.00..270724.92 rows=1840 width=0)
" Index Cond: ((n.movcodite =
(""outer"".int_cod_prod)::real) AND (n.movdatmov >= '2010-10-01'::date)
AND (n.movdatmov <= '2011-03-30'::date))"
-----------------------------------------------------------------------
Depois desse livro agradeço quem puder me ajudar.
Abraços!
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral