我有這三個表嵌套查詢: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