偏移/限制性能优化

时间:2013-12-03 01:05:26

标签: asp.net database postgresql pagination

我的表格结构如下:

  • Id(serial int)(索引)
  • 发布(文字)
  • ...
  • CreationDate(DateTime)(对此描述索引)

我需要实施分页。我的简单查询如下:

SELECT Id, Post, etc FROM Posts ORDER BY CreationDate desc OFFSET x LIMIT 15

当记录很少(低于1百万)时,性能有点可忍受,但当表增长时会有明显的差异。

省略了配置数据库设置(如缓存大小,工作内存,成本,共享内存等)的好处......可以采取哪些措施来提高性能以及使用Postgres进行分页的最佳做法。有类似的问题here,但我不确定这是否也适用于我的情况。

由于我的Id自动递增(如此可预测),我想到的其他选项之一就是有这样的东西

SELECT Id, Post...FROM Posts WHERE Id > x and Id < y

但这似乎使事情变得复杂,我必须一直得到记录的数量,而且不能保证我总会得到15条记录(例如,如果其中一个帖子被删除而且Ids不在“直”序列了。

我也在想CURSOR,但如果我没有错,CURSOR将保持连接打开,这在我的情况下是不可接受的。

1 个答案:

答案 0 :(得分:2)

分页很难; RDBMS模型不适合大量具有有状态滚动的短期查询。如你所知,资源使用往往过高。

您可以选择:

  • LIMITOFFSET
  • 使用光标
  • 将结果复制到临时表或memcached或类似文件,然后从那里读取
  • x > idLIMIT

其中,我更喜欢x > idLIMIT。记住你看到的最后一个ID,并要求下一个ID。如果你有一个单调递增的序列,这将是简单,可靠的,并且对于简单的查询,它将是有效的。