У меня есть эти три таблицы:PostGreSQL Вложенный запрос исполняющей медленно
- создать таблицу слов (ID целочисленные, текст слово, частота целое число);
- создание табличных предложений (целое число, текст предложения);
- создать индекс таблицы (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;
Но когда я хочу, чтобы получить предложение, где два слова встречаются вместе, как:
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 до 15Мб
- бегала анализа всех таблиц
- как уже упоминалось, созданный индекс на слова ид и приговаривает ид
С уважением.
€ Дит:
Вот выход объяснения анализа оператора запроса: http://pastebin.com/t2M5w4na
Эти три создания заявления на самом деле мои оригинальные создания заявления. Должен ли я добавлять первичный ключ к таблицам предложений и слов и ссылаться на них как на внешние ключи в индексе? Но какой первичный ключ я должен использовать для таблицы индексов? SentId и wordId вместе не являются уникальными, и даже если я добавляю pos, который обозначает положение слова в предложении, он не является уникальным.
обновлена:
- создать табличные слова (идентификатор целочисленные, текст слово, частота целочисленные, первичный ключ (идентификатор));
- создание табличных предложений (целое число, текст предложения, первичный ключ (id));
- create table index (wordId integer, предложениеId целое число, целое число, внешний ключ (wordId) ссылки слова (id), внешний ключ (предложениеId) ссылки предложения (предложениеId));
Редактировать ваш вопрос, и вставить вывод 'объяснить анализ your_query', где "your_query" представляет свой хлопотно ЗЕЬЕСТ. Кроме того, реальные инструкции CREATE TABLE могут помочь. –
Ваш индекс 'index' (ужасное имя, BTW) должен иметь по крайней мере первичный ключ. '{sentenceid, position}' является очевидным выбором. Возможно, тоже поможет один или два составных индекса на '{sentenceid, wordid} и/или' {wordid, sentenceid}. – wildplasser
Плюс: вам понадобится UNIQUE ограничение или индекс для ключа _natural_ таблицы слов: самого слова. off-record: RDBMS и nlp - плохое совпадение. Вы можете взглянуть на другие методы хранения (для индексов Postgres: hstore или GIST для полнотекстового поиска) – wildplasser