sql - 如何优化此全文搜索查询? (tsvector)(150 万行)

标签 sql postgresql full-text-search tsvector

我目前在 PostgreSQL 中有一个全文搜索查询(见下文),它扫描一个包含 150 万行的表,以查找与“所有”字词和“任何”字词匹配的所有项目。

对于结果很少的查询,查询可以正确执行并以中等速度(~2-3 秒)执行。并且以惊人的速度获得超过 100,000 次匹配的结果(~15-100 秒)

查询首先按词条类型对结果进行排序(所有词条匹配,然后是任何词条匹配),然后通过 ts_rank_cd 相关性计算对结果进行子排序。 (以及更简单的变体,它按可以索引的已知列排序,例如持续时间)

SELECT
  *,
  ts_rank_cd(textsearchable, query_any_terms) AS relevance,
  textsearchable @@ query_all_terms AS all_terms,
  sum(1) over (PARTITION BY textsearchable @@ query_all_terms) AS match_method_total,
  sum(1) over () AS all_matched_total
FROM
  videos,
  to_tsquery(?) AS query_any_terms,
  to_tsquery(?) AS query_all_terms
WHERE
  website IN (?)
  AND textsearchable @@ query_any_terms
  AND duration_in_seconds >= ?
  AND duration_in_seconds <= ?
ORDER BY
  all_terms DESC, 
  relevance DESC 
LIMIT ? 
OFFSET ?

所有相关列都已编入索引,系统监控显示内存和 CPU 未得到充分利用,瓶颈似乎是磁盘 IO。

服务器是 Ubuntu Server 10.04。内存和 CPU 功率可以根据需要通过后端轻松地动态增加以满足解决方案。

目前数据库在生产时是静态的,写入数据库不会发生在生产服务器上。因此,如果有益的话,可以完全准确地生成一个保持准确的索引。

如果您能帮助找到任何改进途径,我们将不胜感激。可根据要求及时提供其他信息。

最佳答案

使用 tmpfs 将数据库加载到 ram 中,查询时间大大缩短(即从大约 100 秒减少到大约 2 秒)。

见: http://www.slideshare.net/pgconf/five-steps-perform2009

关于sql - 如何优化此全文搜索查询? (tsvector)(150 万行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322517/

相关文章:

sql - 如何聚合维度缓慢变化的数据

mysql - 在MySQL中将行限制为列的总和等于某个值

Java Spring Batch如何从postgres读取数据,然后一步步写入数据

java - Hibernate : Failed to create sessionFactory object. org.hibernate.InvalidMappingException

javascript - 有完整的 HTML/Javascript 在线搜索引擎吗?

java - 无法通过java执行创建表sql查询

sql - 使用维恩图来描述表为集合的 SQL 连接是否合适?

postgresql - 多对多表 - 性能很差

PostgreSQL 全文搜索产生奇怪的结果

python - 有纯 Python Lucene 吗?