SQL查询优化:比较相邻的行

时间:2013-11-20 19:32:23

标签: sql query-optimization

我目前有以下查询需要很长时间才能执行

SELECT * FROM Table t1
WHERE EXISTS
(
    SELECT * FROM Table t2
    WHERE
    (
        t1.Key = t2.Key - 1
        AND t1.Foo = 1
        AND t2.Bar = 0
    )
)

Key是主键字段。我只是比较相邻的行,所以直观地说,最快的实现似乎是比较所有相邻行,N-1说。我的查询的工作方式,我认为它可能是将每一行与Table中的每一行进行比较,即进行N * N比较。

有没有更好的方法来编写查询?

2 个答案:

答案 0 :(得分:2)

如下:

Select t1.*
From table t1
inner join table t2
on t1.key = t2.key - 1
where t1.Foo = 1
and t2.Bar = 0

我在一个有几百万行的表上进行了测试,它在~10秒内运行。

答案 1 :(得分:1)

试试这个:

SELECT t1.* FROM Table t1 
LEFT JOIN Table t2 ON (t1.Key = t2.Key-1) 
WHERE t1.Foo=1 AND t2.Bar = 0

左连接基本上过滤掉表B中不存在的行(在本例中为-t2)。根据经验,如果不需要子查询,或者如果您不确定它们是否会表现良好(快速),则可以避免使用子查询。

另外请确保使用正确的索引(除了Key,我会在字段对上做一个索引:(Foo,Bar)