论坛首页 入门技术论坛

JdbcTemplate中的queryForList()内存溢出

浏览 12002 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-16  
http://blog.csdn.net/5iasp/archive/2006/04/14/663511.aspx
0 请登录后投票
   发表时间:2007-07-03  
特点:一次查询,数据库只返回一页的数据。而不是取出所有的数据。
说明:

pagesize: 每页显示记录数
cureentpage:当前页数

select * from (  select TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage  * from user_table  ORDER BY id ASC ) as aSysTable  ORDER BY id DESC ) as bSysTable  ORDER BY id ASC


例子说明:

假如数据库表如下:

user_table:

id:主键,自增
username:字符
password:字符

假设有80条记录,每页显示10条记录,id 从1到80


现在按照id升序排列取出第三页的数据应该为:所取得记录的id 应该为 21到30。

这时该语句应该为:

select * from (  select TOP 10 * FROM ( SELECT TOP 30  * from user_table  ORDER BY id ASC ) as aSysTable  ORDER BY id DESC ) as bSysTable  ORDER BY id ASC

原理如下:

先按照id从小到大升序取出30条记录(3*10),也就是:id 在 1-30 之间的记录 (SELECT TOP 30  * from user_table  ORDER BY id ASC)

然后按照ID降序排列这30条记录,得到记录为id 在:从30到 1 

然后在这些30条记录中取出前10条记录:取得的记录为:id 在30-21之间。这就是我们需要的数据,但这时是按照降序排列的,不符合要求。

最后在重新排序得到最终我们需要的数据。id在21-30之间。

0 请登录后投票
   发表时间:2007-07-03  
针对Oracle数据库

1. 最好还是利用分析函数
row_number() over ( partition by col1 order by col2 )

比如想取出100-150条记录,按照tname排序

select tname,tabtype from (
   select tname,tabtype,row_number() over ( order by tname ) rn from tab
)
where rn between 100 and 150;

2. 直接使用rownum 虚列
select tname,tabtype from (
   select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;
使用序列不能基于整个记录集合进行排序,如果指定了order by子句,排序的的是选出来的记录集的排序.
------------------------------------------------------
经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的
0 请登录后投票
   发表时间:2007-07-03  
今天突然发现,Oracle原来可以这样实现分页功能:

select * from t_table where rowid not in(select rowid from t_table where rownum<=200) and rownum<=200

上述语句实现了从第201条记录开始处取200条记录
0 请登录后投票
   发表时间:2008-04-14  
一群SB,NND
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics