Buenas

eu tinha problemas de performance com datas, mas resolvi com > <

exemplo
se quero todas as datas de 1/8/2009 e 5/8/2009 uso
explain
SELECT
  ccd.creditodebito,
  CAST ('N' AS CHAR (1)) AS Tipo,
  SUM (valor) AS Total
FROM
  tabela1 ccd
WHERE
  (ccd.data > '2009-07-31') AND
  (ccd.data < '2009-08-06') AND
  (ccd.cupom = 'ccpCadCli') AND
  (ccd.tipo = '2')
GROUP BY ccd.creditodebito, 2

Atenciosamente
Luiz Rafael

----- Original Message ----- 
From: Andre Fernandes
To: Comunidade PostgreSQL Brasileira
Sent: Wednesday, August 05, 2009 10:30 AM
Subject: Re: [pgbr-geral] Indexação com Date


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 

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a