2012-11-28 21 views
8

为了加速基于大型postgres集合的页面的页面生成,我们将查询结果缓存在memcache中。但是,对于非常大或者很少访问的不可变集合,我想知道是否在postgres中保存服务器端游标是一种可行的备用缓存策略。使用postgres服务器端游标进行缓存

这个想法是,在一个集合的中间服务一个页面之后,“next”和“prev”链接比集合中其他地方的随机查询更有可能被使用。我可以在附近放置一个“WITH HOLD”光标,以避免查询的(看似不可避免的)大启动成本?

我想知道服务器上的资源消耗。如果集合是不可变的,保存游标不需要太多的资源,但我想知道postgres在这方面的优化程度。任何链接到进一步的文件将不胜感激。

+0

我设想的缓存策略是存储固定数量的游标。如果某人在某个特定的查询附近,它将用于检索一页结果。否则,闲置时间最长的光标将被重置。 – shaunc

回答

3

你会遇到很多问题。

  • 你就不得不确保相同的用户得到相同的SQL连接
  • 你必须创建一个清理策略
  • 光标将持股待涨真空操作。
  • 你必须说服连接池不清除游标
  • 可能其他问题我没有提到。

总之:不要这样做。如何在后台预先计算下一页/上一页,并将其存储在memcached中?

+0

嗯 - 你能指点我在文档中讨论光标和连接关系的位置吗?如果没有“hold”,游标只在事务中有效,但是我没有发现游标对事务的依赖关系:http://www.postgresql.org/docs/9.2/static/sql-declare .html – shaunc

+0

更新:“可以继续通过后续事务*在同一会话中访问*” - 叹息... precalc仍然重复扫描,但我猜测(最后一次PK - 或任何查询排序)会避免这一点。好 – shaunc