我目前有以下查询需要很长时间才能执行
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比较。
有没有更好的方法来编写查询?
答案 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)