2

次の 3 つのテーブルがあります。

  1. 表の単語を作成します (id 整数、単語テキスト、freq 整数)。
  2. 表文 (id 整数、文テキスト) を作成します。
  3. テーブル インデックスを作成します (wordId 整数、文 ID 整数、位置整数)。

インデックスは逆インデックスで、どの単語がどの文に含まれているかを示します。さらに、表の単語と文から 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;

しかし、次のように 2 つの単語が一緒に出現する文を取得したい場合:

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 のインデックスを作成しました

よろしく。

€同上:

Explain Analyst クエリ ステートメントの出力は次のとおりです: http://pastebin.com/t2M5w4na

これら 3 つの create ステートメントは、実は私のオリジナルの create ステートメントです。テーブルの文と単語に主キーを追加し、これらをインデックスの外部キーとして参照する必要がありますか? しかし、インデックス テーブルにはどの主キーを使用すればよいでしょうか。SentId と wordId は一緒に一意ではなく、文内の単語の位置を示す pos を追加しても一意ではありません。

に更新:

  1. 表の単語を作成します (id 整数、単語テキスト、freq 整数、主キー (id));
  2. 表文を作成します(id整数、文テキスト、主キー(id));
  3. テーブル インデックスを作成します (wordId 整数、sentenceId 整数、位置整数、外部キー (wordId) は単語 (id) を参照、外部キー (sentenceId) は文 (sentenceId) を参照);
4

2 に答える 2

0

wordId列、 にインデックスがないようですsentenceId。それらを作成してください。クエリははるかに高速に動作します。

CREATE INDEX idx_index_wordId ON index USING btree (wordId);
CREATE INDEX idx_index_sentenceId ON index USING btree (sentenceId);

テーブル名として予約語を使用indexすることはお勧めできません。場合によっては、予約語をエスケープする必要があるかもしれません。おそらく、テーブルに列idを追加して主キーにする必要もあります。index

Mosty Mostachoクエリを使用explain analyzeして、インデックスを作成した後にその出力を表示してください。より速く動作する可能性があります。

アップデート:

新しいクエリを試してください:

select S.sentence from sentences S where S.id in
(select sentenceId from index I where 
I.wordId in (select id from words where word IN ('#dreikampf', 'bruederle'))
group by I.sentenceId
having count(distinct I.wordId) = 2
limit 1)
于 2013-10-28T02:15:47.560 に答える