2013-12-17 247 views
2

全部! 我有一个包含具有以下结构的约24百万记录的PostgreSQL 9.3中创建一个表:PostgreSQL。全文搜索性能

CREATE TABLE jtest 
(
    recordid uuid NOT NULL, 
    details json, 
    tsv tsvector, 
    CONSTRAINT jtest_pkey PRIMARY KEY (recordid) 
) 
WITH (
    OIDS=FALSE 
); 

列TSV填补扳机上的JSON内容的理由: to_tsvector(“英语”,json_extract_path_text(详细信息, “信息”)。在JSON结构

现场信息有类似的内容。例如,“牛奶从生产厂家”,“从另外两个牛奶”。大约有100万条记录,其中包含“牛奶”。

如果我使用以下查询:

从jtest中选择recordid,其中tsv @@ to_tsquery('english','milk');

并且不使用tsv列上的任何索引,该查询大约需要250秒。如果我在tsv字段上创建杜松子酒索引,那么该查询大约需要200秒。

有没有可能提高性能?

+0

为什么有人寻找牛奶,如果它在每一个记录? –

回答

2

答案就在问题:

大约有100万条记录,其中包含“牛奶”。

索引与否,您仍然需要检索那百万行。还要注意,如果一百万代表大多数行,Postgres将完全忽略索引,并且seq扫描整个表。

该指数将帮助您查询更改为:

select recordid from jtest where tsv @@ to_tsquery('english', 'rare string');