select rownum,m.* from (
select rownum,s.* from (
select rownum nNo,t.* from userinfo t where t.uname is not null and rownum<= 20
) s order by rownum desc
) m where rownum<=10先不管这个语句是查什么东西的,这语句里面的最里面一层,加了rownum<=20的限制,假如userinfo表有上亿条数据,也就只查了20条,其余的n条就不用查了,
如果这样:
select rownum,m.* from (
select rownum,s.* from (
select rownum nNo,t.* from userinfo t where t.uname is not null
) s order by rownum desc
) m where rownum<=10在最里面一层语句里不加rownum的限制,则:先会遍历一下userinfo表,如果userinfo有上亿条数据的话,则造成了性能下降我这样理解对吗?
select rownum,s.* from (
select rownum nNo,t.* from userinfo t where t.uname is not null and rownum<= 20
) s order by rownum desc
) m where rownum<=10先不管这个语句是查什么东西的,这语句里面的最里面一层,加了rownum<=20的限制,假如userinfo表有上亿条数据,也就只查了20条,其余的n条就不用查了,
如果这样:
select rownum,m.* from (
select rownum,s.* from (
select rownum nNo,t.* from userinfo t where t.uname is not null
) s order by rownum desc
) m where rownum<=10在最里面一层语句里不加rownum的限制,则:先会遍历一下userinfo表,如果userinfo有上亿条数据的话,则造成了性能下降我这样理解对吗?
前段时候看PINER的书,里面有关于这种优化
你的理解正确。第一个sql语句是这样的,第二个sql语句因为order by的结合是 select * ... where cl is not null。所以排序的数据量太多了,而且是 有可能是全表扫描的,所以效率非常低下。
只好试验一下看看了