对 FTS 查询进行分页的最佳方法是什么? LIMIT
和 OFFSET
浮现在脑海中。但是,我担心通过使用 limit 和 offset 我会一遍又一遍地运行相同的查询(即,一次用于第 1 页,另一次用于第 2 页......等等)。
PostgreSQL 是否足够智能以透明地缓存查询结果?因此随后满足来自缓存的分页查询?如果没有,我该如何有效地分页?
编辑
该数据库用于单用户桌面分析。但是,如果这是一个实时 OLTP 应用程序,我仍然想知道最好的方法是什么。我在过去使用 SQL Server 解决了这个问题,方法是创建一组有序的文档 ID,并将针对 ID 的查询参数缓存在一个单独的表中。每隔几个小时清除一次缓存(以便让新文档进入结果集)。
也许这种方法对于 postgres 是可行的。但我仍然想知道数据库中存在的机制以及如何最好地利用它们。如果我是数据库开发人员,我会启用查询-响应缓存以与 FTS 系统一起工作。
最佳答案
服务器端 SQL 游标可以有效地用于此如果客户端 session 可以绑定(bind)到在整个 session 期间保持打开的特定数据库连接。这是因为游标不能在不同的连接之间共享。但如果它是一个桌面应用程序,每个运行的实例都有一个唯一的连接,那很好。
DECLARE CURSOR 的文档解释了当游标在提交的事务中被声明为 WITH HOLD
时,结果集将如何具体化。
锁定 根本不应该是一个问题。如果在游标已经具体化时修改数据,则不会影响读取器也不会阻止写入器。
除此之外,PostgreSQL 中没有隐式查询缓存。 LIMIT/OFFSET 技术意味着对每个页面重新执行查询,这可能与初始查询一样慢,具体取决于执行计划的复杂性和缓冲区缓存和磁盘缓存的有效性。
关于sql - Postgres 对 FTS 查询进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092343/