分页查询

分页查询

就是将将过多的结果在有限的界面上分多页来显示,一般将分页查询分为两类:逻辑分页物理分页

  • 逻辑分页:是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。

    缺点:如果需要查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多次的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。

    优点:统一代码处理方式,较容易跨数据库做迁移。

  • 物理分页:使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。

    优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

ORCALE数据库分页查询

ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法。

第一种:利用分析函数row_number() 方法

select * from(
select t.*,row_number() over (order by t1.id) rowno from TABLE1 t
)
where rowno between 21 and 40;

第二种:直接使用rownum虚列

select * from
(select t.*,rownum as rowno from TABLE1 t)
where rowno between 10 and 20

这两种方法比较,显然第二种方法比较好。因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。

最后提醒大家:oracle中慎用带有order by的分页。尤其是在oracle10g中,会出现会引起混乱,即相同记录会出现在不同页中。

你可能感兴趣的:(分页查询)