只是from打错了!我觉得既然是要根据rownum来进行选择,那么select *,rownum r_id from table1 order by code中的order by code 就可以不用了!筛选时进行了一次全部扫描再进行rownum的筛选实在不可取,不如这样,select * from table1 where rownum >=10000 and rownum<=50000 order by code;如果你有数据可以试一下!
set timing on ;然后进行查询!
如果用如下方法实现分页,对服务器的压力是否会很大 我认为用ROWNUM分页没有用的,服务器必须选出所有的记录,才能生成rownum, rownum是虚拟的,不是客观的,服务器只有生成记录后,才有值,也就是所它会把所有的记录读取出来,我个人认为分页可以用ROWID 最后select * from (select *,rownum r_id from table1 order by code) where rownum >=10000 and rownum<=50000是不返回结果的,我以前这么用就没有出结果,应该写成select * from (select *,rownum r_id from table1 order by code) where rownum <=10000 minus select * from (select *,rownum r_id from table1 order by code) where rownum<=50000
select * from (select *,rownum r_id from table1 order by code) where r_id >=10000 and r_id<=50000没有什么排序效果! 如果要达到排序效果,性能更不能保证 不排序: select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
select * from (select *,rownum r_id from table1 order by code) where r_id >=10000 and r_id<=50000没有什么排序效果! 如果要达到排序效果,性能更不能保证 不排序: select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
排序本来就慢 select * from (select a.*,row_number() over(order by code) rm from table1 a) where rm<=50000 where rm>=10000;
rownum 根本就是傻子干的,他本身就是一个虚拟的值,你可以随便建一个少数据量的表,然后用order by 某个字段,再看看rownum,此时rownum是动态的变化的,就是说不同的order by,会产生不同的结果,使用rowid还是好的,但是rowid的问题在于物理地址的重复使用,也同样会产生先后定位不正确
但不是理想的.如果r_id是索引,并且第一句中能用索引则性能好一点.
否则则能从别的方面考虑了。如缓存表等(但可能不好)
用这样的语句,一次性的查出来吧,至于后面的分页相对量,自己另外用变量来控制它吧。。
为什么第一句没有结果!怎么可能;就效率而言,肯定是第一句好!因为第一句最多只需要全盘扫描一次;
我认为用ROWNUM分页没有用的,服务器必须选出所有的记录,才能生成rownum,
rownum是虚拟的,不是客观的,服务器只有生成记录后,才有值,也就是所它会把所有的记录读取出来,我个人认为分页可以用ROWID
最后select * from (select *,rownum r_id from table1 order by code) where rownum >=10000 and rownum<=50000是不返回结果的,我以前这么用就没有出结果,应该写成select * from (select *,rownum r_id from table1 order by code) where rownum <=10000
minus
select * from (select *,rownum r_id from table1 order by code) where
rownum<=50000
如果要达到排序效果,性能更不能保证
不排序:
select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
如果要达到排序效果,性能更不能保证
不排序:
select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
select * from (select a.*,row_number() over(order by code) rm from table1 a) where rm<=50000 where rm>=10000;
这个问题困扰我半年了,一直没法解决。用SQL Server也没法解决(按非唯一索引列排序时)。
难道真的没有人解决问题吗?No!看看oracle的SQLPlus,执行一个返回大量数据的SQL语句,不是一次返回所有记录吧!想想人家是怎么做的。
效率很好,可行,不需要加order by