2011-09-23 37 views
0

我有一个表格中的单词(该表格被称为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 

有没有更好/更快的方法来做到这一点?

+0

子选择的目的是什么?有没有理由不能用普通的内连接来做到这一点? – SingleNegationElimination

+0

问题1:您不必要地在子查询中排序结果。问题2:您正在加入WHERE子句中的表而不是JOIN子句。 (不知道这是否会影响性能,但至少令人困惑。) – Keith

回答

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得到更多的东西。

+0

'SELECT w1.text,w2.text FROM token w1 JOIN token w2 USING(sentence,textblockid) WHERE w1.position = w2.position - 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 
+0

可能这句话不是唯一的,而是句子是一个值,它是文本的索引;事实上,我就是这样解释他们的;换句话说,我假设关键是(textblockid,句子)不是(句子)。 – SingleNegationElimination

+0

句子不是外键既不唯一。句子只是句子的位置/数量。第一句,第二,第三,第四,... –

+0

好吧。我将编辑我的文章,以将引用添加到'textblockid'。无论如何,你是否有'语句'的索引? – bfavaretto