请问sql语句怎么写才是在内存中排序啊
order by 不是在内存中排序吗

解决方案 »

  1.   

    不太懂你的意思.直接order by 不就行了吗?
      

  2.   

    order by ,假如要排序的数据少,可以在内存中放的下,就是内存排序。假如要排序的数据多,内存放不少,就得要借助磁盘完成排序
      

  3.   

    我看一篇ppt上面说 “尽可能避免排序;尽可能在内存中排序;”
    所以我不太明白什么叫在内存中排序
    order by是不是在内存中排序呢
      

  4.   

    是的,如你所说,由量来决定,这个量的标准是由参数:sort_area_size来控制,通过show parameter sort;查看其参数信息。所以一般你控制不了。对于你的疑问:1、一般不要用排序,如何控制,这种控制是在这个字段上创建建立索引,因为索引本身是已经按照键值被排序后的数据了,然后如果你是正向排序,使用:
    /*+INDEX_ASC(表在SQL中的别名,索引名称)*/
    反向排序为:
    /*+INDEX_DESC(表在SQL中的别名,索引名称)*/如你有一张表叫test,中间有一个字段是ID,在其起初上创建了缩影:IDX_TEST_ID,你此时要按这个字段正向排序:
    SELECT /*+INDEX_ASC(t,IDX_TEST_ID)*/ *
    FROM TEST t
    ORDER BY t.ID;而要反向排序就这样写:
    SELECT /*+INDEX_DESC(t,IDX_TEST_ID)*/ *
    FROM TEST t
    ORDER BY t.ID;原始写法:
    SELECT *
    FROM TEST t
    ORDER BY t.ID;对比一下执行计划看下,此时你查看执行计划和不适用的执行计划就会少一个步骤,就是SORT ORDER BY,而使用后使用:TABLE ACCESS BY ROWID2、如何尽量在内存中排序,其实不好控制,是在业务允许的情况下,是先过滤掉大部分数据,然后在这个基础上过滤,而不是先排序后在去排序(但是需要业务上允许),因为排序的数据少了,占用的空间自然就少了。
      

  5.   

    不好意思,反向排序的SQL写错了,补充一下:
    SELECT /*+INDEX_DESC(t,IDX_TEST_ID)*/ *
    FROM TEST t
    ORDER BY t.ID DESC;
      

  6.   

    是这样的!这个是oracle自己控制的!
      

  7.   

    可以指定sort_area_size这个参数,指定ORACLE用于每个Session排序的内存大小自动PGA管理,则只能设置PGA的大小,由ORACLE动态管理sort_area_size的大小
      

  8.   

    sort_area_size的大小可以配置用于排序的内存缓冲的大小,越大,用于内存排序的空间也越大,排序时间也会快一些。
      

  9.   

    PGA       是为每个用户进程连接ORACLE数据库保留的内存       进程创建时分配,进程结束时释放,只能被一个进程使用       PGA包括了以下几个结构:       排序区       游标状态区       会话信息区       堆栈区       由参数:pga_aggregate_target 决定