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

Responder a