我有一个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]
感谢您的意见。我在下面试过,但都没有工作。
我认为缓冲会导致响应速度的差异。 当我在服务器响应后重试搜索时,第二次响应速度提高了100多倍。 当我重新启动服务器并执行相同的SQL时,响应再次减慢。