3

对 FTS 查询进行分页的最佳方法是什么?LIMITOFFSET浮现在脑海。但是,我担心通过使用限制和偏移量,我会一遍又一遍地运行相同的查询(即,一次用于第 1 页,另一次用于第 2 页......等)。

PostgreSQL 会足够聪明,可以透明地缓存查询结果吗?因此随后满足来自缓存的分页查询?如果没有,我如何有效地分页?

编辑

该数据库用于单用户桌面分析。但是,我仍然想知道最好的方法是什么,如果这是一个实时的 OLTP 应用程序。过去,我通过创建一组有序的文档 ID 并针对单独表中的 ID 缓存查询参数来解决 SQL Server 的问题。每隔几个小时清除一次缓存(以便让新文档进入结果集)。

也许这种方法对 postgres 是可行的。但我仍然想知道数据库中存在的机制以及如何最好地利用它们。如果我是数据库开发人员,我会启用查询响应缓存以与 FTS 系统一起使用。

4

2 回答 2

3

如果客户端会话可以绑定到在整个会话期间保持打开的特定数据库连接,则可以有效地使用服务器端 SQL 游标。这是因为游标不能在不同的连接之间共享。但是,如果它是一个桌面应用程序,每个运行实例都有唯一的连接,那很好。

DECLARE CURSOR的文档解释了WITH HOLD在提交的事务中声明游标时结果集将如何实现。

锁定根本不应该是一个问题。如果在光标已经物化时修改数据,它不会影响读取器,也不会阻塞写入器。

除此之外,PostgreSQL 中没有隐式查询缓存。LIMIT/OFFSET 技术意味着对每个页面重新执行一次查询,这可能与初始查询一样慢,具体取决于执行计划的复杂性以及缓冲区缓存和磁盘缓存的有效性。

于 2012-08-23T16:01:02.923 回答
2

好吧,老实说,您可能希望您的查询返回一个活动光标,然后您可以重用它来获取它(光标)表示的结果的某些部分。现在,我不知道 PostGre 是否支持这一点,Mongo DB 支持,我已经尝试过这条路,但它并不酷。例如:您是否知道从查询完成到需要该查询的第二页结果之间需要多长时间?如果时间,光标可以停留在那个量吗?如果可以,它究竟意味着什么,它是否会阻塞资源,这样如果你有很多懒惰的用户,他们开始查询但需要很长时间浏览页面,你的服务器可能会被锁定的游标卡住?

老实说,我认为每次有人要求某个页面时重做一个分页查询是可以的。首先,您将返回少量条目(一次不需要显示超过 10-20 个条目),这将非常快,其次,您应该更可能调整您的服务器,以便它快速执行频繁的请求(添加索引,必要时将其放在Solr服务器后面等),而不是让这些查询运行缓慢,但缓存它们。

最后,如果你真的想加快全文搜索,并且有花哨的索引,如不区分大小写、启用前缀和后缀等,你应该看看Lucene或更好的Solr(它是类固醇上的 Lucene)作为一个 in-在您的用户和您的持久层之间的搜索和索引解决方案之间。

于 2012-08-23T13:18:28.180 回答