Bom dia, Uma coisa que pode melhorar um pouco a performance é não usar (ccd.data >= '2009-07-01') AND (ccd.data <= '2009-07-02')
mas sim ccd.data between '2009-07-01' and '2009-07-02' (between costuma ser mais rápido em vários bancos, imagino que no postgreSQL também seja) e quando for uma única data ccd.data = '2009-07-01' Abraços, 2009/8/4 Rafael Domiciano <[email protected]> > Boa Tarde Senhores, > > Tenho uma pequena dúvida, agradeço a atenção de todos. > > Na minha query abaixo: > > explain > SELECT > ccd.creditodebito, > CAST ('N' AS CHAR (1)) AS Tipo, > SUM (valor) AS Total > FROM > tabela1 ccd > WHERE > (ccd.data >= '2009-07-01') AND > (ccd.data <= '2009-07-01') AND > (ccd.cupom = 'ccpCadCli') AND > (ccd.tipo = '2') > GROUP BY ccd.creditodebito, 2 > > Eu tenho a seguinte saida no explain: > QUERY PLAN > HashAggregate (cost=9.16..9.17 rows=1 width=10) > -> Index Scan using caeindccd_22 on tabela1ccd (cost=0.00..9.15 rows=1 > width=10) > Index Cond: ((data >= '2009-07-01'::date) AND (data <= > '2009-07-01'::date)) > Filter: ((cupom = 'ccpCadCli'::bpchar) AND (tipo = '2'::bpchar)) > > Ou seja, a query demora nada mais do que uma consulta rápida no indice. > Porém, se eu aumentar o período para 31 dias a saída do explain fica assim: > > > explain > SELECT > ccd.creditodebito, > CAST ('N' AS CHAR (1)) AS Tipo, > SUM (valor) AS Total > FROM > tabela1 ccd > WHERE > (ccd.data >= '2009-07-01') AND > (ccd.data <= '2009-07-31') AND > (ccd.cupom = 'ccpCadCli') AND > (ccd.tipo = '2') > GROUP BY ccd.creditodebito, 2 > > QUERY PLAN > HashAggregate (cost=59747.72..59747.74 rows=1 width=10) > -> Index Scan using caeindccd_04 on tabela1ccd ccd > (cost=0.00..59745.16 rows=342 width=10) > Index Cond: ((data >= '2009-07-01'::date) AND (data <= > '2009-07-31'::date) AND (cupom = 'ccpCadCli'::bpchar)) > Filter: (tipo = '2'::bpchar) > > Aumentou exponencialmente o custo da consulta, apesar de estar indexida. > > Enfim, aonde quero chegar? > > Percebi que o Postgres não lida muito bem com a performance passando > grandes períodos (pode ser que eu esteja errado), não sei como funciona em > outros bancos, mas acho isso um pouco falho no Postgres. > Para minimizar esses problemas, foi adotado junto ao setor de > Desenvolvimento, que na base de produção não seria possível sqls com > períodos superiores a 30 dias, mas mesmo assim temos caso como o de cima. > > Pergunta: Existe alguma maneira de fazer uma consulta com períodos e ter > uma boa performance? > > No maior período da tabela existem 20 mil registros. > > Agradeço, novamente, a atenção. > > Atenciosamente, > > Rafael Domiciano > > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > -- André de Camargo Fernandes
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
