使用>表中的Postgresql查询速度太慢12M行

时间:2015-10-29 15:19:48

标签: postgresql

我的网络应用程序中每次都有一个超过1,200万行的简单表格。

#import <Framework/fileName.h>

我正在使用此查询获取今天事件的数量

+-----+-----+------+-------+--------+
| id  | dtt | cus  | event | server |
-------------------------------------

我的网络应用程序的性能非常糟糕:22702毫秒。

SELECT COUNT(*)  FROM events
    WHERE dtt AT TIME ZONE 'America/Santiago' >=date(now() AT TIME ZONE 'America/Santiago') + interval '1s' 
    AND cus=2

我创建了下一个索引:

"Aggregate  (cost=685814.54..685814.55 rows=1 width=0) (actual time=21773.451..21773.452 rows=1 loops=1)"
"  ->  Seq Scan on events  (cost=0.00..675644.52 rows=4068008 width=0) (actual time=10277.508..21732.548 rows=409808 loops=1)"
"        Filter: ((cus = 2) AND (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval)))"
"        Rows Removed by Filter: 12077798"
"Planning time: 0.127 ms"
"Execution time: 21773.509 ms"

使用Postgresql 9.4,Linux x64

我怎样才能改善这一点?提前谢谢。

2 个答案:

答案 0 :(得分:1)

类似的东西:

CREATE INDEX dtt_tz_idx ON  events (DATE(dtt AT TIME ZONE 'America/Santiago'));

然后查询

SELECT COUNT(*)  FROM events
    WHERE DATE(TIMEZONE('America/Santiago'::text, dtt)) >=date(now() AT TIME ZONE 'America/Santiago') + interval '1s' 
    AND cus=2

如果它不起作用,请在psql中尝试“\ d dtt_tz_idx”并尝试将查询中的数据类型与索引匹配。

答案 1 :(得分:0)

最后我可以解决该索引的问题:

CREATE INDEX dtt_tz_idx ON  events (TIMEZONE('America/Santiago'::text, dtt));

谢谢sivan&amp; vyegorov为您的向导,现在的计划是:

"Aggregate  (cost=567240.43..567240.44 rows=1 width=0) (actual time=238.440..238.440 rows=1 loops=1)"
"  ->  Bitmap Heap Scan on events  (cost=82620.28..556463.97 rows=4310584 width=0) (actual time=41.445..208.870 rows=344453 loops=1)"
"        Recheck Cond: (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval))"
"        Filter: (cus = 2)"
"        Rows Removed by Filter: 9433"
"        Heap Blocks: exact=9426"
"        ->  Bitmap Index Scan on dtt_tz_idx  (cost=0.00..81542.63 rows=4415225 width=0) (actual time=38.866..38.866 rows=353886 loops=1)"
"              Index Cond: (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval))"
"Planning time: 0.221 ms"
"Execution time: 238.509 ms"