我在postgresql(10.2)数据库中有一个类似于下面的表...
create table (user_id text, event_time timestamp, ...);
我想在自联接中使用此表,以便在接下来的5分钟内将来自同一user_id和event_time的记录与其他记录进行匹配。类似于...
select
*
from
test as a
inner join
test as b
on
a.user_id = b.user_id
and a.event_time < b.event_time
and a.event_time > b.event_time - interval '5 minutes';
这样做很好,但我希望它更快一些。我已经让连接使用user_id
上的索引,但我想知道是否有可能创建一个同时使用user_id和时间戳的索引?
我试过在从事件时间到事件时间加5分钟的tsrange上建立一个gist索引,但是Postgres似乎在这种情况下只使用user_id索引。我试过在user_id和tsrange上建立一个多列索引,但是似乎不支持。
最后,我尝试只对时间戳创建索引。
这一切似乎都无济于事。
然而,时间戳覆盖了很长的时间段,我只对5分钟的窗口感兴趣,直觉上这是一个好的索引应该有所帮助的。
这能做到吗?
1条答案
按热度按时间4uqofj5v1#
对
user_id
文本和event_time
时间戳的多列索引应该可以使用。对范围的gist索引还需要包括用户id,并且它的通用性较差,因为它只能在固定的5分钟间隔内使用。除非您实际上需要在表上建立一个排除约束,否则我不会使用它。