我有一个类似于这样的 SQL 查询:
SELECT * FROM(
SELECT
...,
row_number() OVER(ORDER BY ID) rn
FROM
...
) WHERE rn between :start and :end
基本上,是ORDER BY这一部分使事情变慢。如果我将其删除,EXPLAIN成本将下降一个数量级(超过1000倍)。我尝试过这样做:
SELECT
...
FROM
...
WHERE
rownum between :start and :end
但是这样做并不能得出正确的结果。有没有简单的方法可以加速它?或者我需要花更多时间使用EXPLAIN工具吗?
CBO
足够聪明,能够选取索引。在这里真正起作用的是ROWNUM
而不是ROW_NUMBER
。 - Quassnoi