1

SELECT instmax,
r
FROM
(SELECT instmax,
rownum r
FROM
(SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
WHERE rownum <= 10
)
WHERE r >=6;

输出

替代文字

SELECT instmax,
r
FROM
(SELECT instmax,
rownum r
FROM
(SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
)
WHERE r 介于 6 和 10 之间;

输出

替代文字

两个查询之间真的有明确的性能提升吗?你能澄清一下吗?

4

2 回答 2

1

Oracle 无法将涉及别名的条件推ROWNUM送到内联视图中。

这意味着第二个查询将使用带有过滤的全表(或索引)扫描rn,而第一个查询将使用STOPKEY(因为它使用 unaliased ROWNUM < 10

您可能想阅读这篇文章:

于 2010-08-27T08:59:20.937 回答
0

这可能是因为 STOPKEY 优化不再起作用。

“rownum < xx”非常特殊(称为 Top-N 查询),具有特殊优化。between 子句不再触发。

您应该比较执行计划并查找“STOPKEY”,如果它在,则它是优化的 Top-N 查询。

也可以看看:

http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/

于 2010-08-27T08:48:21.663 回答