为什么这些看似相似的查询具有如此截然不同的运行时间?

时间:2010-04-29 19:57:20

标签: sql performance oracle

我正在使用oracle DB试图调整一些查询,而我无法理解为什么以特定方式处理特定子句会对查询性能产生如此大的影响。这是我正在进行的查询的高性能版本

select * from 
(
    select a.*, rownum rn from 
    ( 
         select *
         from table_foo
    ) a where rownum <= 3
) where rn >= 2

使用此

替换最后两行的相同查询
    ) a where rownum >=2 rownum <= 3
) 

表现得非常糟糕。几个数量级的恶化

    ) a where rownum between 2 and 3
) 

也表现得非常糟糕。我不理解第一个查询的魔力以及如何将其应用于进一步的类似查询。

2 个答案:

答案 0 :(得分:4)

我的理解是rownum赋值发生在选择行之后(或'as'),因此任何'大于1'的'ROWNUM&gt; = n'查询都会导致麻烦。向我解释的是,第一行是关注的;它是rownum 1,所以它不符合标准而被丢弃。下一行是看;由于结果集为空,它仍然是rownum 1,并且它不符合标准并被丢弃。此过程将继续,直到读取并拒绝所有行。

长时间运行的查询是否实际产生了任何数据?或者你总是在它完成之前杀死它?

答案 1 :(得分:1)

ROWNUM是查询中可用的伪列(非实列)。 ROWNUM将被分配数字1,2,3,4,... N,其中N是与ROWNUM一起使用的集合中的行数。在第一种情况下,你正在减少蝙蝠的行数,而在第二种情况下,你必须寻找所有东西来切断大于2的东西。