我在PostgreSQL 9.5.2数据库上有一个表events
,其中包含id
,userid
和event_datetime
列。我想为每个事件计算用户会话(最后30分钟)中先前事件的数量。这就是我想出的:
SELECT T1.id, COUNT(*) "cnt"
FROM events T1
INNER JOIN events T2
ON T1.userid = T2.userid
AND T1.event_datetime > T2.event_datetime -- T1 happened later than T2
AND T1.event_datetime - INTERVAL '30 MINUTES' < T2.event_datetime -- but not more than 30 minutes
GROUP BY T1.id;
但是,events
表非常大,上面的查询需要很长时间。你有没有看到我如何优化它?
编辑:我刚刚意识到,通过排除匿名用户,我可以大幅减少表格大小。这暂时解决了我的问题。但仍然是一个有趣的问题。感谢您的评论!
答案 0 :(得分:1)
有150个 K 事件的偏见用户导致性能问题。 从查询中删除此用户。
稍后我将发送一个不涉及删除用户的解决方案。