Jhe*_*ico 6 sql oracle performance
我正在使用oracle DB尝试调整一些查询,而我无法理解为什么以特定方式处理特定子句会对查询性能产生如此大的影响.这是我正在进行的查询的高性能版本
select * from
(
select a.*, rownum rn from
(
select *
from table_foo
) a where rownum <= 3
) where rn >= 2
Run Code Online (Sandbox Code Playgroud)
通过用此替换最后两行来进行相同的查询
) a where rownum >=2 rownum <= 3
)
Run Code Online (Sandbox Code Playgroud)
表现得非常糟糕.几个数量级的恶化
) a where rownum between 2 and 3
)
Run Code Online (Sandbox Code Playgroud)
也表现得非常糟糕.我不理解第一个查询的魔力以及如何将其应用于进一步的类似查询.
我的理解是 rownum 分配发生在选择行之后(或“as”),因此任何 n 大于 1 的“ROWNUM >= n”查询都会引起麻烦。向我解释的是,查看第一行;rownum为1,所以不符合标准,被丢弃。查看下一行;它仍然是 rownum 1,因为结果集是空的,并且它不符合条件并被丢弃。此过程持续进行,直到所有行都已被读取并拒绝。
长时间运行的查询实际上会产生任何数据吗?或者你总是在它完成之前杀死它?