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有上亿条数据的话,则造成了性能下降我这样理解对吗?

解决方案 »

  1.   

    YES,回答正确,第二种写法只不过返回客户端只有十条,但查询还是全表
    前段时候看PINER的书,里面有关于这种优化
      

  2.   


    你的理解正确。第一个sql语句是这样的,第二个sql语句因为order by的结合是 select * ... where cl is not null。所以排序的数据量太多了,而且是 有可能是全表扫描的,所以效率非常低下。
      

  3.   

    不知道会不会把userinfo表里的最大的数据查询出来,因为order by 在倒数第二层而不是最内层
    只好试验一下看看了