无法从大表中检索结果

时间:2013-11-22 19:43:49

标签: oracle oracle11g

我正在针对具有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

2 个答案:

答案 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;