PostgreSQL多字字符串比较超时

PostgreSQL多字字符串比较超时,postgresql,search,Postgresql,Search,我正在尝试对主实体\u name运行大约1000万行的搜索。但是,每次fq有一个空格时,查询都会超时 // "dog" works // "walking dog" times out select * from companies where primary_entity_name LIKE '%walking dog%' limit 10 解释(分析打开,缓冲打开) Limit (cost=0.00..21551.17 rows=10 width=1542) (actual time

我正在尝试对
主实体\u name
运行大约1000万行的搜索。但是,每次
fq
有一个空格时,查询都会超时

// "dog" works
// "walking dog" times out

select *
from companies
where primary_entity_name LIKE '%walking dog%'
limit 10 
解释(分析打开,缓冲打开)

Limit  (cost=0.00..21551.17 rows=10 width=1542) (actual time=52210.872..269801.658 rows=6 loops=1)
  Buffers: shared hit=1429 read=2115468
  ->  Seq Scan on companies  (cost=0.00..2247787.26 rows=1043 width=1542) (actual time=52210.871..269801.644 rows=6 loops=1)
      Filter: ((primary_entity_name)::text ~~ '%walking dog%'::text)
      Rows Removed by Filter: 10471215
      Buffers: shared hit=1429 read=2115468
Planning time: 0.113 ms
Execution time: 269801.687 ms
查询计划

Limit  (cost=0.00..21551.17 rows=10 width=1542) (actual time=52210.872..269801.658 rows=6 loops=1)
  Buffers: shared hit=1429 read=2115468
  ->  Seq Scan on companies  (cost=0.00..2247787.26 rows=1043 width=1542) (actual time=52210.871..269801.644 rows=6 loops=1)
      Filter: ((primary_entity_name)::text ~~ '%walking dog%'::text)
      Rows Removed by Filter: 10471215
      Buffers: shared hit=1429 read=2115468
Planning time: 0.113 ms
Execution time: 269801.687 ms
Limit  (cost=0.00..41950.28 rows=10 width=1569)
  ->  Seq Scan on companies  (cost=0.00..1959078.25 rows=467 width=1569)
    Filter: ((primary_entity_name)::text ~~ '%walking dog%'::text)

我认为这只是一个巧合,你观察到一个包含空格的搜索词持续时间很长。用不同的字符串尝试几次

搜索词的长度可能会产生一些影响,但该查询中最大的性能障碍是I/O

从执行计划中,您可以看到查询必须从磁盘读取大约16GB的数据,并扫描1000万行以找到6个匹配的行。无论您的搜索模式是什么,只要以
%
开头,成本都将保持不变


如果你真的需要在字符串中间搜索字符串,你应该看看PostgreSQL的全文搜索功能,它能准确地描述你在例子中显示的用例。如果你需要在单词中间匹配字符串,事情就变得更难了——你可能想查一下代码>艺龙网> <代码>。用不同的字符串尝试几次

搜索词的长度可能会产生一些影响,但该查询中最大的性能障碍是I/O

从执行计划中,您可以看到查询必须从磁盘读取大约16GB的数据,并扫描1000万行以找到6个匹配的行。无论您的搜索模式是什么,只要以
%
开头,成本都将保持不变


如果你真的需要在字符串中间搜索字符串,你应该看看PostgreSQL的全文搜索功能,它能准确地描述你在例子中显示的用例。如果你需要在单词中间匹配字符串,事情就变得更难了——你可能想检查<代码> PGY-TrGG。

你应该接受实际的查询,用<代码>解释(分析,缓冲器)< /代码>运行并发布这两个计划。谢谢-请看上面@ LaurenzAlbeYou应该接受实际的查询,使用
EXPLAIN(分析、缓冲区)运行它们
并发布这两个计划。谢谢-请参见上文@Laurenzalbe当我只
选择“主要实体名称”时
查询时间缩短到不到两秒。查询外观如何以及执行计划是什么?将查询计划添加到原始帖子中。当我只
选择“主要实体名称”时
查询时间缩短到不到两秒。查询外观如何?执行计划是什么?已将查询计划添加到原始帖子中。