应该是这样的吧:
select * from demo where rownum<1000010
minus
select * from demo where rownum<1000000表示取第1000000开始的10条记录**************泪眼问花花不语
乱红飞过秋千去
select * from demo where rownum<1000010
minus
select * from demo where rownum<1000000表示取第1000000开始的10条记录**************泪眼问花花不语
乱红飞过秋千去
解决方案 »
- proc的makefile生成的临时文件如何清理
- 能否写一种程序点击直接生成oracle固定的数据库和表,方便用户安装操作
- Oracle9i 客戶端無法連接服務器(300分求解)
- oracle 触发器 更新问题
- 关于索引的建立问题,举个例子请大家帮忙建个索引.
- 俺刚开始学习触发器,见到csdn上有人提到变异表,哪位给解释一下是什么概念?
- 请问高手-在oracle里面如何知道一个表的大小??
- 怎样用一条语句可以查询上级所有部门,详细内容请进来看
- Oracle 中 怎么执行两句select 语句
- delete 和 truncate对于表空间的影响
- 高分求orcale8i的下载地址。
- 如何使用oracle的date型数据
查询结果的意思我是知道的,我只是想知道他的实际效率如何?
尤其是数据量在几百万条记录的时候
minus
select * from demo where rownum<1000000
的写法我在sql/plus 报错:数据类型不一致
我的写法:
select ygid from (select rownum rn,ygid from t_ygjbxx) where rn>100 and rn<5000
select .... from
( select rownum rm,demo.* from demo )
where rm between 1000000 and 1000010;
我觉着还是 jlandzpa(ORA-00600)的应该更快才是
minus
select * from demo where rownum<1000010
这个效率不高的话,应该没有高的了
http://www.csdn.net/expert/topic/665/665679.xml?temp=.3550226
此帖是精华帖,不信去看看讨论结果。
select * from demo where rownum<1000010
minus
select * from demo where rownum<1000000
执行性能很差,因为要进行大量的比较操作。
还有这个SQL没有Order by是没有多大意义的。
大家举的都是2层嵌套,这需要Order by 的字段有索引,不信用可以不按顺序插入数据试试。
我记得有一个三层嵌套的语句可以解决这个问题,一时记不起来,找到了发给大家。
*
from
table_name
where
rownum>100000
and
rownum<100010
这样就可以了。
这样是选不出来的。
rownum不能这样用
最快的方式就是通过rowid来取,
测试环境:oracle8.1.5, win2000 server, 128M内存
测试过程:使用表tb(name,age),表中有500000数据
每次都是重新启动数据库后运行查询语句SQL> set timing on
SQL> select * from tb where rownum<400000
2 minus
3 select * from tb where rownum<399990;NAME AGE
---------- ---------
n399990 399990
n399991 399991
n399992 399992
n399993 399993
n399994 399994
n399995 399995
n399996 399996
n399997 399997
n399998 399998
n399999 399999已选择10行。实际:34266SQL> set timing on
SQL> select * from ( select rownum id,tb.* from tb where rownum<400000) where id>=399990; ID NAME AGE
--------- ---------- ---------
399990 n399990 399990
399991 n399991 399991
399992 n399992 399992
399993 n399993 399993
399994 n399994 399994
399995 n399995 399995
399996 n399996 399996
399997 n399997 399997
399998 n399998 399998
399999 n399999 399999已选择10行。实际:16172SQL> set timing on
SQL> select * from tb where rowid>='AAADEgAABAAAYYLAAM' and rowid<='AAADEgAABAAAYYLAAV';NAME AGE
---------- ---------
n399990 399990
n399991 399991
n399992 399992
n399993 399993
n399994 399994
n399995 399995
n399996 399996
n399997 399997
n399998 399998
n399999 399999已选择10行。实际:4517
测试结果:使用minus用的时间最长,其次是使用rownum,最快的就是使用rowid,但要先知道起始位置rowid;
select * from ( select rownum id,tb.f1,tb.f2 from tb where rownum<400000 order by tb.f1) where id>=399990;
测试结果并不是对全部记录进行的排序,而是对选出的数据进行的排序
怎样解决前者
select * from tb where rownum<1000000
minus
select * from tb where rownum<999990;
平均需要8.43秒
select * from ( select rownum id,tb.* from tb where rownum<1000000) where id>=999990
平均需要1.83秒
其实最简单的方法是把以上方案都做test。
让事实说话。
select * from ( select rownum id,tb.f1,tb.f2 from tb where rownum<400000 order by tb.f1) where id>=399990;
测试结果并不是对全部记录进行的排序,而是对选出的数据进行的排序
怎样解决前者
测试结果
SQL> select * from demo where rownum<400000
2 minus
3 select * from demo where rownum<399990; ID NAME
---------- --------------------
399990 GH0399990
399991 GH0399991
399992 GH0399992
399993 GH0399993
399994 GH0399994
399995 GH0399995
399996 GH0399996
399997 GH0399997
399998 GH0399998
399999 GH0399999已选择10行。已用时间: 00: 00: 14.00
SQL> select * from ( select rownum rnum,demo.* from demo where rownum<400000) where rnum>=399990; RNUM ID NAME
---------- ---------- --------------------
399990 399990 GH0399990
399991 399991 GH0399991
399992 399992 GH0399992
399993 399993 GH0399993
399994 399994 GH0399994
399995 399995 GH0399995
399996 399996 GH0399996
399997 399997 GH0399997
399998 399998 GH0399998
399999 399999 GH0399999已选择10行。已用时间: 00: 00: 00.21
select results.* from
( select t2.*, rownum rownumber from
( select t.* from mv_table t where order by col1) t2) results
where results.rownumber between 30 and 50 order by col1 大家提到的都是2层的,这需要order by的字段是主键或是唯一索引!!!!!!,不信用非顺序插入数据试试。
*
from
table_name
where
rownum>100000
and
rownum<100010可能要好点,我现在就在处理这样的事情,在几百万条数据中进行分类转移,正叫个痛苦。我是在前台用DELPHI开发的程序进行海量数据处理,不过如果能把查询语句作为一种线程处理不管是速度还是性能都要好快点
事实上也的确如此,如果在纯ORACLE下进行可能要累死人了:)