查看表格时间戳字段中最独特日期的最快方法?

时间:2011-05-17 22:46:36

标签: postgresql greenplum

我有一张数十亿行的表。 “已记录”字段上有每日分区,这是“没有时区的时间戳”。我想知道目前哪些日子在表中。我知道我可以这样做:

SELECT recorded::date
FROM table
GROUP BY 1;

理想情况下应该有效,但对此的解释相当高,并表明工作需要相当长的时间......如果这是我能做的最好的,我可以接受(我们可以密切关注数据进入),但我想知道是否有更有效的方法来做到这一点,因为我每天都有分区?

2 个答案:

答案 0 :(得分:2)

你可以创建这样的索引:

create index your_index_name
on table (date_trunc('day', recorded))

在我的测试中,PostgreSQL 9.something在添加索引之前使用顺序扫描,在简单地索引“记录”列之后使用顺序扫描,在使用date_trunc()索引之后使用索引扫描。选择一天的行在没有索引的情况下花费66毫秒,使用普通索引花费68毫秒,使用date_trunc()选择13毫秒的索引。

有了数十亿行,期望创建该索引需要几分钟。 (咳嗽)

答案 1 :(得分:1)

这里有一个非常相似的主题:

Slow select distinct query on postgres

如果您知道最小/最大日期,那么查询日期列表比在整个表格上执行seq扫描更好。假设你有一个记录索引,看起来像这样的东西应该更快:

with days as (
select date_trunc('day', min(recorded))::date + k * interval '1 day' as day
from records,
     generate_series(0,
                    (select date_trunc('day', max(recorded))::date
                            - date_trunc('day', min(recorded)::date
                    from records
     )) as k
)
select day
from days
where exists (
      select 1
      from records
      where day <= recorded and recorded < day + interval '1 day'
      );

上面的查询可能会有一些调整,但总的想法是:在索引字段上进行几千个子查询/索引扫描比在seq扫描几十亿更快行和聚合它们以识别不同的日子。