有个百万级记录的表共3109447条记录
我用两个方法查询,不知道哪个效率更高些declare
table_id NUMBER; 
start_time timestamp;
end_time timestamp;
begin
 select localtimestamp into start_time from dual;
 select max(table_a_id) into table_id from table_a;
 select localtimestamp into end_time from dual;
 dbms_output.put_line('start_time is'||start_time);
 dbms_output.put_line('end time is'||end_time);
 dbms_output.put_line('exute time is:'||(end_time-start_time));
end; declare
table_id NUMBER; 
start_time timestamp;
end_time timestamp;
begin
 select localtimestamp into start_time from dual;
 select table_a_id into table_id from table_a where rownum=1 order by table_a_id desc;
 select localtimestamp into end_time from dual;
 dbms_output.put_line('start_time is'||start_time);
 dbms_output.put_line('end time is'||end_time);
 dbms_output.put_line('exute time is:'||(end_time-start_time));
end; 

解决方案 »

  1.   

    这样执行下来,不知道什么原因,时间大小总是交替,一会是用max执行时间长点,一会是用order by时间长点
      

  2.   

    晕死,不好意思,题目写错了,是order by 和max的
      

  3.   


    只要table_a_id字段有最为起始列的index,区别应该不会很大。因为index是排过序的,读其中的最大、最小值会很快。
      

  4.   


    如果没有排过序呢,好像max就慢的不行,我测试过,要11秒多,而用order的却相差不大,没有什么影响
    排过序的情况下
    两个的时间也都是在0.0055500秒左右,有时候都会用到0.01......秒
    整体相差也不是很大,到底是什么原因,是不是rownum=1起到很大作用
      

  5.   

    index没有不排序的!
    max有时很慢,是因为你的index可能经历过大量数据的delete或者insert,导致index不平衡了,执行alter index rebuild后就会ok的。order by很快跟rownum=1很有关系哦。
      

  6.   

    只要table_a_id字段有最为起始列的index,区别应该不会很大。
    不好意思,这句我不是很明白。。烦请指点一二
    如果不用table_a_id,而用一个很普通的table_a_description呢谢谢
      

  7.   

    只要table_a_id字段有最为起始列的index,区别应该不会很大。 
    是笔误,应该是:
    只要table_a_id字段有为起始列的index,区别应该不会很大。 
      

  8.   

    起始列的index
    也不大明白能指点一下么?
      

  9.   

    是不是和ms-sql里面的主键一样的啊
      

  10.   

    如果是排序好了,也就是降序的话,rownum应该要快些,没有的话,我想max要快些。。不过我没有测试过。。
      

  11.   

    如果是排序好了,也就是降序的话,这句是什么意思呢
    郁闷
    到底是
    select max(table_a_num) into table_num from table_a;

    还是
    select table_a_num into table_num from table_a where rownum=1 order by table_a_num desc;
    快啊
    换成一个普普通通的数字类型的table_a_num,什么附加属性都没有的
    理论上哪个会快一些
      

  12.   

    都不快,相比的话,单纯的降序排列,可能是max快点
      

  13.   

    个人认为有索引的情况下max会快一点
    没有索引的情况下两个语句应该是差不多的..
      

  14.   

    我晕死,你们没有发现rownum和order by 不能一起用么,我用order by降序了,却始终差得结果是升序的第一个,还好操作的结果不多,误操作了100条数据左右,不然就完蛋了。。
    哪位大哥能说明白一点么?
    就是一个普通的列,可以为空,可以重复,数字类型,查询出该列值最大的一条数据。
    怎么样才能获得很好的查询效率。
    最好查询该列的时候还能带上另外几个列,比如
    select max(table_a_no),table_a_id........这样的效果。。
    也可以分做两条select语句写,反正求效率最高的查询语句。
    谨谢!
      

  15.   

    楼上的我稍微做了一下,但是没那么多时间来做统计,我做了大约20几组数据,两种执行效率大体差不多,如果要真正统计的话,估计要几千或者几万组数据吧,我没那么多时间啊,所以我就想请教CSDN上的兄弟,看有没有哪位遇到过这个实际问题或者是按照理论知识来解答一下。
    多谢
      

  16.   

    数据少也能trace出来啊,也能看出差异的。主要是看统计信息里的逻辑读和物理读,还有sort次数。
      

  17.   

    楼上的大哥,你说的我可就不懂了,还请指教
    trace和逻辑读、物理读,我都没听过,不知道是否可以指点一下,谢谢啦
      

  18.   

    简单地先在sqlplus中执行:set autotrace traceonly
    然后在相同会话中运行你的那两条查询语句,就能看结果了。
    不过如果你的oracle版本低于10g,可能还要去建执行计划表。
      

  19.   

    多谢了,楼上的VC555
    我的是9I的,怎么建执行计划表呢,呵呵
      

  20.   

    单单看sql语句的话
    应该是max效率高一点