当数据量增加时,%like%search会突然减慢

时间:2015-04-27 06:31:00

标签: postgresql

我有一个SQL搜索字符串列中的单词。 该列具有通过pg_trgm扩展启用中间匹配的索引。

CREATE INDEX index ON "Texts" USING gist (body gist_trgm_ops);
SELECT * FROM "Texts" WHERE body like '%hogehoge%';

当满足以下条件时,文本搜索效果很好。

Table size : 34 MB
Index size : 722 MB
-> Total runtime :  1.03 sec

但是,当我增加数据量时,响应速度会明显减慢。

Table size : 42 MB 
Index size : 1321 MB
-> Total runtime : 91.38 sec 

我改变了#34; shared_buffers"跟上索引大小,但它没有改变响应时间。 有没有想法让反应更快?

  

[服务器规格]
   -OS:Windows Server 2012 R2
    - 内存大小:4GB
  [postgresql.conf设置]
    -effective_cache_size:3145383kB
    -shared_buffers:1228MB - > 2228MB
    -work_mem:6290kB
  [版本]
   PostgreSQL 9.2.4

[编辑]
EXPLAIN ANALYZE的结果如下:(表格大小与上面不同,但响应时间也非常慢。)

正常:http://explain.depesz.com/s/cUk

Bitmap Heap Scan on "Texts"  (cost=31.01..69.08 rows=10 width=139) (actual time=1515.342..1568.444 rows=999 loops=1)"
  Recheck Cond: ((text_body)::text ~~ '%hogehoge%'::text)
  ->  Bitmap Index Scan on Texts_index  (cost=0.00..31.00 rows=10 width=0) (actual time=1514.642..1514.642 rows=999 loops=1)
        Index Cond: ((text_body)::text ~~ '%hogehoge%'::text)
Total runtime: 1573.718 ms

慢:http://explain.depesz.com/s/u7O

Bitmap Heap Scan on "Texts"  (cost=88.46..204.18 rows=30 width=139) (actual time=406272.437..427309.329 rows=2999 loops=1)
  Recheck Cond: ((text_body)::text ~~ '%hogehoge%'::text)
  ->  Bitmap Index Scan on texts_index  (cost=0.00..88.46 rows=30 width=0) (actual time=406241.142..406241.142 rows=2999 loops=1)
        Index Cond: ((text_body)::text ~~ '%hogehoge%'::text)
Total runtime: 427419.800 ms

[EDIT2]
感谢您的意见。我在下面试过,但都没有工作。

  • SET STATISTICS(-1 - > 10000)和ANALYZE
  • 将内存大小从4GB增加到8GB

我认为缓冲会导致响应速度的差异。 当我在服务器响应后重试搜索时,第二次响应速度提高了100多倍。 当我重新启动服务器并执行相同的SQL时,响应再次减慢。

0 个答案:

没有答案