Как ускорить этот тип запроса? - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть таблица со словами из текста (таблица называется token), каждое слово является строкой в ​​таблице.Я хочу получить соседние слова в результате.

Пример: My name is Renato должен возвращать:

My | name
name | is
is | Renato

Следующий запрос работает, но работает медленно.textblockid определяет текст, которому принадлежит слово, sentence - количество предложений в текстовом блоке (но на данный момент значение равно 1 для всех), а атрибут position определяет порядок слов.

select w1.text,w2.text 
from token as w1,
    (select textblockid,sentence,position,text from token
    order by textblockid,sentence,position) as w2
where w1.textblockid = w2.textblockid
and w1.sentence = w2.sentence
and w1.position = w2.position - 1

Есть ли лучший / более быстрый способ сделать это?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Я не знаю postgresql подробно, но наверняка запрос может быть проще на сервере sql:

select w1.text,w2.text 
from token as w1, token as w2
where w1.textblockid = w2.textblockid
and w1.sentence = w2.sentence
and w1.position = w2.position - 1

(я думаю, что лучше использовать самый простой запрос, а остальное оставить для оптимизатора, который может быть введен в заблуждение вашим из подзапроса).

Однако, если у вас есть индекс (textblockid, предложение, позиция), вы действительно не сможете получить ничего больше с помощью sql.

0 голосов
/ 23 сентября 2011

Может быть, INNER JOIN со вторым экземпляром token работает лучше.Но все зависит от типов данных ваших столбцов и имеющихся у вас индексов.

Например, если sentence текстовый столбец, сравнение между w1.sentence и w2.sentence, вероятно,быть очень дорогимЕсли это числовой идентификатор (внешний ключ к таблице sentences), и если у вас есть индекс для столбца, он должен быть намного быстрее.Предполагая этот последний сценарий, вы можете попробовать это:

select w1.text,w2.text 
from token as w1
    INNER JOIN token as w2
    ON w2.sentence = w1.sentence
    AND w1.position = w2.position - 1
    AND w1.textblockid = w2.textblockid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...