java中oracle分页查询语句oracle数据速度慢,怎么解决好

2008年2月 总版技术专家分月排行榜第一2008年1月 总版技术专家分月排行榜第一
2008年7月 总版技术专家分月排行榜第三2008年6月 总版技术专家分月排行榜第三
2011年4月 Java大版内专家分月排行榜第二2010年8月 Java大版内专家分月排行榜第二2010年5月 Java大版内专家分月排行榜第二2008年2月 Java大版内专家分月排行榜第二2007年7月 Java大版内专家分月排行榜第二
2011年2月 Java大版内专家分月排行榜第三2010年9月 Java大版内专家分月排行榜第三2008年9月 Java大版内专家分月排行榜第三2008年1月 Java大版内专家分月排行榜第三2007年11月 Java大版内专家分月排行榜第三2007年9月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。oracle分页查询语句,java得到分页查询语句的方法 -
- ITeye博客
博客分类:
oracle分页查询语句
select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &= 40 ) where rn &= 21
java得到分页查询语句的方法
* 得到分页查询的语句
* @param queryString
* @param pageIndex
* @param pageSize
public String getPageQl(String queryString, int pageIndex, int pageSize){
//select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &= 40 ) where rn &= 21
String ql = "select * from ( select page_.*, rownum rn from ("+queryString+") page_ where rownum &= "+pageIndex*pageSize+" ) where rn & "+(pageIndex-1)*pageS
排序的时候,最好再加上按id排序,解决翻页数据重复的问题。
浏览: 834625 次
来自: 北京
推荐另一种生成excel的方法。用pageoffice生成ex ...
java_zhenke 写道非常感谢楼主,但是为何我执行转换报 ...Oracle分页查询的优化方案
&今天看到一份资料上有讲到Oracle分页处理时的查询优化方式,其思路是:对于要查询多列数据的一个分页查询语句,可以在内部的Oracle查询rownum时,不查询出所有要需要的列,而是查询一个rowid,再用一个表连接的方式,来查询所需要的列,这样就不会使用太多的*来查询,Oracle的sql语句解析器也就不会在解析sql语句时,消耗更多的资源,例子如下:
一般的查询分页查询方式是:
&&&SELECT *
&( SELECT a.* ,ROWNUM rn FROM
--取得rownum值
&& (SELECT t.* FROM dept t
ORDER BY t.deptno)a
&--查询整表的数据列,并按表某一个字段进行排序&
&WHERE ROWNUM&20)
--对rownum大于20的进行过滤
&&WHERE rn&2
--对rownum大于2的进行过滤
现在新的做法是:
SELECT t.* FROM dept t, & --表连接,关联查询
&&(SELECT rd FROM (
--取得所有的rowid
SELECT rd,rn FROM&
(SELECT ROWID rd,ROWNUM rn FROM dept ORDER BY
deptno)&--查询整表rowid和rownum,并按进行排序&
WHERE rn&20) --过滤rownum大于20的数据
&&WHERE rn
&2) t1 --过滤rownum小于2的数据
&&WHERE t.ROWID =
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4681人阅读
oracle(61)
DB 优化(22)
JDBC(13)
SQL Server(8)
sql 基础——oracle(29)
robbin对oracle
ROWNUM 方式分页效率问题的看法:
/topic/8805:
&row_.*,&rownum&rownum_&from
&(......&)&row_&where
&rownum&&=&?)&where
&rownum_&&&?&&
select * from ( select row_.*, rownum rownum_ from (...... ) row_ where rownum &= ?) where rownum_ & ?
这种用嵌套3层的分页sql是处理效率最高的办法,你找不到更高效的方法了。
我在2000的时候就研究Oracle的分页问题了,研究了半年多,换了好多种办法,最后确定还是这种办法最高效。
返回有条件且经过排序的某段记录(三层结构)
url: /topic/186927?page=2
&&&&&&&&&&from
&t.*,&rownum&num &&
&&&&&&&&&&&&&&&&&&from
&userinfo&t &&
&&&&&&&&&&&&&&&&&where
&siteid&=&73 &&
&&&&&&&&&&&&&&&&&order
&regtime&desc
&&&&&&&&&where
&num&&&11;&
数据库分页大全(
利用解析函数
高效分页)
t_order limit
t_order limit
以上版本也支持关键字
* from t_order where id not in (select id from t_order where
条记录开始取
A.*,ROWNUM
& num FROM
解析函数进行分页
t.*,row_number()
over(ORDER
解析函数能用格式
按照某个字段分区
按照勒个字段排序
/topic/394708
czllfy:&& 发表时间:&&
经过对单表2134043W数据进行测试发现row_number分布耗时15S,而采用ROWNUM仅0.0062S
/blog/241293
(一)分页实现及性能
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。
分页查询格式:
SELECT * FROM
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM
TABLE_NAME) A
WHERE ROWNUM &= 40
WHERE RN &= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM &= 40和RN &=
21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE
ROWNUM &= 40这句上。
选择第21 到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM &=
40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM &=
40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:
SELECT * FROM
SELECT A.*,
FROM (SELECT * FROM TABLE_NAME) A
WHERE RN BETWEEN 21
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO
优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM &=
40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND
40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对
于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率
要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO
一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH
JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED
LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE
JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED
LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
SELECT /*+ FIRST_ROWS */ *
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM &= 40
WHERE RN &= 21
(二)Oracle Top n
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
ROWNUM &= 40
以上是oracle 实现top n的功能
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM between 2 and 100
总是返回空记录
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
举例说明:
例如表:student(学生)表,表结构为:
ID   &&& char(6)      --学号
name    VARCHAR2(10)   --姓名
create table student (ID char(6), name
VARCHAR2(100));
insert into sale values('200001',&张一&);
insert into sale
values('200002',&王二&);
insert into sale values('200003',&李三&);
into sale values('200004',&赵四&);
(1) rownum 对于等于某值的查询条件
果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因
为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n&1的自然数)。
SQL& select rownum,id,name from student where
rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
SQL& select rownum,id,name from
student where rownum=1;
&&& ROWNUM ID&&&& NAME
---------- ------
---------------------------------------------------
&&&&&&&& 1 200001 张一
SQL& select rownum,id,name from student where rownum =2;
&&& ROWNUM
ID&&&& NAME
---------- ------
---------------------------------------------------
(2)rownum对于大于某值的查询条件
&& 如果想找到从第二行记录以后的记录,当使用rownum&2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle
认为rownum& n(n&1的自然数)这种条件依旧不成立,所以查不到记录
SQL& select rownum,id,name
from student where rownum &2;
ROWNUM ID&&&& NAME
---------- ------
---------------------------------------------------
那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
SQL&select * from(select rownum no ,id,name from student) where no&2;
&&&&&&& NO ID&&&& NAME
---------- ------
---------------------------------------------------
&&&&&&&& 3 200003 李三
&&&&&&&& 4 200004 赵四
SQL& select * from(select rownum,id,name from
student)where rownum&2;
&&& ROWNUM ID&&&& NAME
---------- ------
---------------------------------------------------
(3)rownum对于小于某值的查询条件
如果想找到第三条记录以前的记录,当使用rownum&3是能得到两条记录的。显然rownum对于rownum&n((n&1的自然数)的条件认为是成立的,所以可以找到记录。
SQL& select rownum,id,name from student where rownum &3;
ROWNUM ID&&&& NAME
---------- ------
---------------------------------------------------
&&&&&&& 1 200001 张一
&&&&&&& 2 200002 王二
上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的,rownum对
于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之
间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记
录行。但是这样的操作会在大数据集中影响速度。
SQL& select * from (select rownum no,id,name from
student where rownum&=3 ) where no &=2;
&&&&&&& NO ID&&&& NAME
---------- ------ ---------------------------------------------------
&&&&&&&& 2 200002 王二
&&&&&&&& 3 200003 李三
(4)rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
select rownum ,id,name from s
&&& ROWNUM ID&&&& NAME
---------- ------ ---------------------------------------------------
&&&&&&&& 3 200003 李三
&&&&&&&& 2 200002 王二
&&&&&&&& 1 200001 张一
&&&&&&&& 4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
SQL& select rownum ,id,name from (select * from student order by name);
&&& ROWNUM ID&&&& NAME
---------- ------
---------------------------------------------------
&&&&&&&& 1 200003 李三
&&&&&&&& 2 200002 王二
&&&&&&&& 3 200001 张一
&&&&&&&& 4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大)
以上为rownum的必学处,为了更好地使用rownum打下基础。
其 实, 理解rownum的关键是Oracle 如何执行查询语句.
如果先执行笛卡尔集运算,再执行where条件限制,那么rownum就可以实现 rownum& n(n&=1)的功能.
但oralce是边执行笛卡尔集运算,边应用选择条件,所以rownum&n(n&1=)永远不成立 ( 网友评论 )
--- 自我练习,
嘿嘿 表: BOOKS
select rownum,isbn,title,price from (select * from BOOKS
order by price desc);
& from (select rownum ro,b.* from
BOOKS b where rownum & 10)
where ro & 5;
select * from BOOKS
where rownum & 10;
&& from (select b.*,
&&&&&&&&&&&&&&& rownum ro
&&&&&&&&&& from BOOKS b
&&&&&&&&& where
rownum & 20
& where ro & 10;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2022436次
积分:14543
积分:14543
排名:第825名
原创:85篇
转载:424篇
评论:141条
(3)(1)(4)(9)(2)(12)(2)(1)(1)(1)(2)(11)(4)(8)(4)(9)(3)(11)(4)(8)(11)(2)(11)(1)(5)(3)(2)(4)(24)(24)(8)(1)(3)(5)(2)(1)(8)(3)(3)(1)(9)(16)(11)(3)(1)(1)(1)(1)(1)(1)(5)(1)(2)(20)(19)(2)(7)(19)(8)(8)(25)(24)(29)(8)(1)(6)(1)(1)(26)(10)(1)(12)(7)}

我要回帖

更多关于 oracle 分页查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信