================以下引自 http://www.cnblogs.com/hxw/archive/2005/09/11/234619.html=================================
1.根据ROWID来分
select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from
t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
执行时间0.03秒
2.按分析函数来分
select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;
执行时间1.01秒
3.按ROWNUM来分
select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where
rn>9980;执行时间0.1秒
其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录
个人感觉1的效率最好,3次之,2最差
===============引用结束=================================
其中第3种方法之所以慢,是select * 引起的,最内层循环必须要select * 才能保证取得所有的列,外层循环的select *都依赖于它,因此没有办法优化,第一种写法和第三种很像,只是在分页的时候只select rid,只是在最后select的时候才取所有字段,效率比较高。 如果最外层用连接而不是in,效率应该还可以提高点。
==================递归查询===============================
一个部门结构,id表示员工号,parentId为上司工号,name为姓名(见图片)。 现在要求根据一个员工的姓名(唯一)来查询他的最高上司信息(最高上司没有parentId),因此可以用
select m.*
from
(select t.id, t.parentid,t.name from xfyq_1.t_recurse t
start with t.name = '王三'
connect by prior t.parentid = t.id) m
where m.parentid is null
其中start with ... connect by prior 是递归查询, prior的一端表示上一条记录,上面语句表示把“王三”这个根结点, prior t.parentId = t.id 表示取id为上一条记录的parentId,这里的上一条记录就是当前的“王三”这条记录,依次类推。
1.根据ROWID来分
select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from
t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
执行时间0.03秒
2.按分析函数来分
select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;
执行时间1.01秒
3.按ROWNUM来分
select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where
rn>9980;执行时间0.1秒
其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录
个人感觉1的效率最好,3次之,2最差
===============引用结束=================================
其中第3种方法之所以慢,是select * 引起的,最内层循环必须要select * 才能保证取得所有的列,外层循环的select *都依赖于它,因此没有办法优化,第一种写法和第三种很像,只是在分页的时候只select rid,只是在最后select的时候才取所有字段,效率比较高。 如果最外层用连接而不是in,效率应该还可以提高点。
==================递归查询===============================
一个部门结构,id表示员工号,parentId为上司工号,name为姓名(见图片)。 现在要求根据一个员工的姓名(唯一)来查询他的最高上司信息(最高上司没有parentId),因此可以用
select m.*
from
(select t.id, t.parentid,t.name from xfyq_1.t_recurse t
start with t.name = '王三'
connect by prior t.parentid = t.id) m
where m.parentid is null
其中start with ... connect by prior 是递归查询, prior的一端表示上一条记录,上面语句表示把“王三”这个根结点, prior t.parentId = t.id 表示取id为上一条记录的parentId,这里的上一条记录就是当前的“王三”这条记录,依次类推。