如何加快这种类型的查询?

时间:2011-09-23 16:54:28

标签: sql postgresql

我有一个表格,其中包含文字中的单词(表格称为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 个答案:

答案 0 :(得分:1)

我不太详细了解postgresql,但确保在sql server中查询更简单:

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获得更多。

答案 1 :(得分:0)

第二个INNER JOIN实例的token表现更好。但这完全取决于列的数据类型以及您已有的索引。

例如,如果sentence是文本列,则w1.sentencew2.sentence之间的比较可能会非常昂贵。如果它是一个数字id(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
相关问题