oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据

oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据
最新回答
信上诗两行

2021-06-04 15:50:50

在Oracle数据库中,分页查询通常有两种常见方式。第一种是通过ROWNUM进行排序和限制,如下所示:

select * from (select a.*, rownum rn from (select * from test a order by object_name) a where rownum <=1000) where rn > 990;

这种方式虽然简单,但在处理大量数据时,第一页和第1000页之间的性能差异会很明显。因为对于大表来说,Oracle需要先对整个表进行排序,然后选取前1000行,最后再筛选出第1001行开始的数据。这样会导致较高的IO和CPU消耗。

另一种方法是利用索引进行分页。具体来说,可以先在索引上进行排序,然后根据ROWID获取实际数据。这种方式的性能相对稳定,因为索引操作通常比全表扫描快得多。尽管在使用HINT指定索引的情况下,查询可能仍会尝试全表扫描,但实际上,如果索引覆盖了需要的所有列,那么查询性能应该不会受到太大影响。

例如,下面的SQL语句尝试使用索引进行分页:

select b.* from (select * from (select a.*, rownum rn from (select /*+ index(a ix_object_name) */ rowid rid from test a order by object_name) a where rownum <=20) where rn > 10) a, test b where a.rid = b.rowid;

这里使用了/*+ index(a ix_object_name) */ HINT来指定使用ix_object_name索引,但实际执行计划可能仍会显示使用全表扫描。这是因为Oracle的优化器可能会根据具体情况选择不同的执行计划。

总的来说,对于性能优化,选择合适的索引和正确使用SQL提示是非常重要的。同时,了解Oracle的执行计划和性能调优工具也有助于更好地管理和优化数据库查询。