各位大神求帮忙啊 为什么用第二种写法分十次查出 100 条数据得出来的结果有重复的,而且就算是直接用下面的写法一次得到 100 条数据,得到结果也不一样,name 字段是没有索引的。 比如
exa_00 得到结果
exa_01 得到的结果却是
--exa_00
select * from
(select rownum id, tb.*
from
(select name from user_info order by name) tb
)
where id> 0 and id<100;
--exa_01
select * from
(select rownum id, tb.* from
(select name from user_info order by name) tb
where rownum <100)
where id >0;
补充一下 在之前的语句上,最外层的select中加了个子查询,explain plan 出来,差别在非常大,exa_02的耗时是exa_03的10倍
--exa_02
select out_tb.*
(select contract_name c from contract where c.contract_name=out_tb. name) as contract
from
(select rownum id, tb.*
from
(select name from user_info order by name) tb
) out_tb
where id> 0 and id<100;
--exa_03
select out_tb.*,
(select contract_name c from contract where c.contract_name=out_tb. name) as contract
from
(select rownum id, tb.* from
(select name from user_info order by name) tb
where rownum <100) out_tb
where id >0;
1
dong3580 2017-12-23 11:20:41 +08:00 via Android 1
第一个先排序所有的,再从排序后取出 0 - 100 之间的,
第二个排序 0 - 100 并取出。 两个查询的范围压根不一样吧? 有几年没写 PL/SQL 了,弱弱的问一句,表一共只有 100 条数据? |
3
bxb100 2017-12-23 11:42:52 +08:00 via Android 1
rownum 产生实在表记录扫描时产生,排序后进行,你可以抽出来自己看一下,rownum 是乱的. 你可以先排序,然后对结果分页
select * from ( select rownum r, t.* from (select * from user_info order by name) t where rownum <= 100) where r > 0 |
4
xcc7624 OP @bxb100 我查过 oracle 的官网 rownum 确实你说的那样,order by 的字段有没有索引对 rownum 也有影响,你的写法是我上面的第二种吧?种写法得出的结果分页查出来数据有重复的
|
6
sun1991 2017-12-23 18:22:45 +08:00 via Android
第二个查询,select ... from tb, 即使 tb 本身进行了排序,也不能保证 select 结果是有序的。顺序必须用 order by 来保证,但是 order by 是在数据返回后才进行计算的。
|