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