表里有x,y等字段,现在我想查询x最小的那条记录的y,尽管用order by x很容易,但是不用order by也尽量不用子查询等多层查询怎么搞定啊,请多指教当然实际情况要更复杂,x是几个字段进行运算后组合成的,之所以不用order by排序是因为数据量较大,在2-3千万次排序后,oracle的pga内存被吃尽,排查问题后发现很有可能是因为排序的关系。如果用两次查询,先查min(x),再查询一次当x=min(x)的时候的y,就会很影响效率,而且也不知道min是不是就比较省内存,啊啊啊啊,救我

解决方案 »

  1.   

    虽然用了order by,但这样的方法你可以试试看!~~ (atj 为表名)1: ------------------------------
         select *
           from (
                 select a.*,row_number() over(order by a.x) as rn
                   from atj a
                )
          where rn = 1 ;
    2: ------------------------------------     
         select *
           from (
                 select *
                   from atj
                  order by x
                )
          where rownum = 1;
      

  2.   

    从前用的基本上就是第二种方法。。第一种方法,由于x字段是由多个字段经过函数运算后组成的,我刚试了一下,感觉用over速度挺慢的,是不是我错觉,汗,而且这样可以省内存么。。需要很久才能试验一次,晕。。
      

  3.   

    SELECT y
      FROM tab
     WHERE x = (SELECT MIN (x)
                  FROM tab)
    x可建立索引
    你执行一下分析计划看看,另外,使用toad的Optimize SQL产生几条优化的语句看看.