sql - Postgres 对 FTS 查询进行分页

标签 sql postgresql pagination full-text-search postgresql-9.1

对 FTS 查询进行分页的最佳方法是什么? LIMITOFFSET 浮现在脑海中。但是,我担心通过使用 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/

相关文章:

会计报表的SQL

javascript - 如何使用javascript生成页码?

java - 更改 Web 服务中的日期格式

sql - 一对一的数据库关系?

sql - Mysql:如何创建具有多个主键的表?

javascript - 如何检测在数据表中的完整分页类型中单击的第一个、上一个、下一个、最后一个按钮

javascript - 使用nodejs fbgraph 对 facebook Graph API 进行分页

MySQL pivot 单行

sql - Money 数据类型的平均值

java - 从postgresql中批量插入的行中检索序列号