我有这三个表嵌套查询:PostgreSQL的执行缓慢
- 创建表的话(ID整数,字文,频率整数);
- 创建表句(id整数,句子文本);
- 创建表索引(wordId integer,sentenceId integer,position integer);
索引是倒排索引,表示哪个词出现在哪个句子中。 Furthermoore我有一个来自表单词和句子的id的索引。
此查询确定哪些句子出现一个给定的字,并返回第一个匹配:
select S.sentence from sentences S, words W, index I
where W.word = '#erhoehungen' and W.id = I.wordId and S.id = I.sentenceId
limit 1;
但是,当我想要检索其中两个词一起出现的一句话:
select S.sentence from sentences S, words W, index I
where W.word = '#dreikampf' and I.wordId = W.id and S.id = I.sentenceId and
S.id in (
select S.id from sentences S, words W, index I
where W.word = 'bruederle' and W.id = I.wordId and S.id = I.sentenceId
)
limit 1;
这查询要慢得多。有什么窍门可以加速吗?下面的事情我做了这么远:
- shared_buffer将增加至32MB
- 增加work_mem到15MB
- 跑分析所有表上 作为词ID和句子ID提到创建的索引
关心。
€秩:
这里是解释分析查询语句的输出:http://pastebin.com/t2M5w4na
这三个创建语句其实我原来的创建语句。我应该将主键添加到表格句子和单词中,并将它们作为索引中的外键引用?但是,我应该为索引表使用哪个主键? SentId和wordId在一起并不是唯一的,即使我添加表示单词在句子中的位置的pos也不是唯一的。
更新为:
- 创建表字(ID整数,字文本,频率整数,主键(id));
- 创建表句(id整数,句子文本,主键(id)); (wordId integer,sentenceId integer,位置整数,外键(wordId)引用单词(id),外键(sentenceId)引用句子(sentenceId));创建表索引
编辑你的问题,并粘贴的输出'解释分析your_query',其中 “your_query” 代表你的麻烦SELECT语句。而且,实际的CREATE TABLE语句可以帮助很多。 –
你的表'索引'(可怕的名字,BTW)至少需要一个主键。 “{sentenceid,position}”是明显的选择。在'{sentenceid,wordid}'和/或'{wordid,sentenceid}'上有一个或两个复合索引也可能有帮助。 – wildplasser
加号:对于单词表的_natural_键,您需要一个UNIQUE约束或索引:“单词”本身。不记录:RDBMS和nlp是不匹配的。您可以查看其他存储方法(对于Postgres:hstore或GIST索引进行全文搜索) – wildplasser