查找MAX(db时间戳)查询

时间:2010-06-03 21:54:45

标签: postgresql

我在postgres中有多个索引的BIG表。它在db_timestamp,id,username上有索引。

我想找到特定用户名的MAX时间戳。 问题是简单的查询,如

SELECT MAX(db_timestamp) FROM Foo WHERE username = 'foo'

因为巨大的表格大小而花费了很多时间(我们说的是450GB表格,索引大小超过30 GB)。

他们是否可以优化此查询或告诉postgres使用什么查询计划?

2 个答案:

答案 0 :(得分:2)

使用在username和db_timestamp上创建索引并使用正确的排序顺序:

CREATE INDEX idx_foo ON foo (username ASC, db_timestamp DESC);

检查EXPLAIN以查看事情是否正常工作。

答案 1 :(得分:1)

Postgresql不能使用(db_timestamp,id,username)上的索引来满足该查询 - 您之后的查询词必须是索引的前缀,即使用第一列。

因此,(username,db_timestamp)上的索引可以很好地服务于该查询,因为它只需要扫描子树(用户名,0)..(用户名,+ inf)(和iirc Postresql实际上应该知道尝试和找到(用户名,+ inf)并按顺序向后走。)

一般来说,“覆盖索引”对Postgresql来说不是一种有用的技术,就像它与其他数据库一样,因为Postgresql需要引用堆元组来获取可见性信息。