【发布时间】:2013-11-06 14:38:20
【问题描述】:
我有这三个表:
- 创建表格单词(id整数、单词文本、频率整数);
- 创建表格句子(id整数,句子文本);
- 创建表索引(wordId整数、sentenceId整数、位置整数);
Index 是倒排索引,表示哪个单词出现在哪个句子中。此外,我有一个来自表格单词和句子的 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
这三个create语句其实是我原来的create语句。我应该在表格句子和单词中添加主键并将它们作为索引中的外键引用吗?但是我应该为索引表使用什么主键? SentId 和 wordId 一起不是唯一的,即使我添加 pos 表示单词在句子中的位置,它也不是唯一的。
更新为:
- 创建表单词(id整数、单词文本、频率整数、主键(id));
- 创建表格句子(id整数、句子文本、主键(id));
- 创建表索引(wordId整数,sentenceId整数,位置整数,外键(wordId)引用词(id),外键(sentenceId)引用句子(sentenceId));
【问题讨论】:
-
编辑您的问题,并粘贴
explain analyze your_query的输出,其中“your_query”代表您麻烦的 SELECT 语句。此外,实际的 CREATE TABLE 语句也有很大帮助。 -
你的表
index(可怕的名字,顺便说一句)至少需要一个主键。{sentenceid, position}是显而易见的选择。在{sentenceid,wordid}和/或{wordid,sentenceid}上设置一个或两个复合索引可能也会有所帮助。 -
另外:你需要一个 UNIQUE 约束或索引表的 natural 键:
word本身。记录外:RDBMS 和 nlp 不匹配。您可以查看其他存储方法(对于 Postgres:hstore,或用于全文搜索的 GIST 索引) -
键值对{sentenceid, position}不是唯一的,因为有些句子是重复的。感谢您提供有关其他存储方法的信息。
-
为什么要允许重复的句子?没有额外的(关键)列,重复的句子是没有意义的。
标签: database postgresql relational-database