我正在针对具有15,000,000行的表发出一个非常简单的查询。我遇到关于rownum
限制的不稳定行为。
例如,在查询
之后select * from (select * from my_table order by id) where rownum < 2000000
没有问题,以及这个
select * from (select * from my_table order by id) where rownum between 1 and 15
但这个永远不会完成
select * from (select * from my_table order by id) where rownum between 2 and 15
我无法解释这种行为:当下限为0时,上限可以很大而没有任何问题,但是当下限仅为2时,它永远不会完成。同样奇怪的是,它们之间没有:它要么几乎立即返回,要么永远不会完成。
该表在id
列上编制索引,它是一个asc
- 排序索引;否则我认为即使只是第一条记录也需要一个完整的表格排序。
我应该在哪里调查以解决这个问题?
我的数据库是Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
答案 0 :(得分:2)
正如@prezmyslawKruglej开始解释的那样,条件where rownum > 1
永远不会返回任何记录。它是described in detail by Tom Kyte。
我建议你改用row_number()
函数,比如
select ... from (
select ..., row_number() over (order by whatever) as rn from ...
) where rn between 10 and 20
答案 1 :(得分:2)
试试这个:
SELECT * FROM (
SELECT /*+ FIRST_ROWS */ myquery.*, ROWNUM rnum
FROM (
SELECT * FROM mytable ORDER BY id
) myquery
WHERE ROWNUM <= 15
) WHERE rnum >= 2;