Postgres Paginating FTS查询

时间:2012-08-23 13:09:51

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

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

PostgreSQL是否足够智能透明地缓存查询结果?从而随后从缓存中满足分页查询?如果没有,我如何有效地分页?

修改

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

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

2 个答案:

答案 0 :(得分:3)

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

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

锁定根本不应该是一个问题。如果在光标已经实现的情况下修改数据,则不会影响阅读器或阻止编写器。

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

答案 1 :(得分:2)

嗯,说实话,你可能想要的是你的查询返回一个实时的Cursor,然后你可以重用它来获取它(Cursor)所代表的结果的某些部分。现在,我不知道PostGre是否支持这一点,Mongo DB确实如此,而且我已经尝试过这条路,但这并不酷。例如:您是否知道在完成查询和需要该查询的第二页结果之间会传递多长时间?如果时间光标可以保持光标吗?如果它可以,它究竟意味着什么,它会阻止资源,这样如果你有很多懒惰用户,谁开始查询但需要很长时间浏览页面,你的服务器可能会被锁定的游标陷入困境?

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

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