情况如下:
表名称为BILL,里面有50万条记录,现在要查询这张表。在PL/SQL Developer中查询。测试语句如下:
1、select * from bill。查询效率很快,只需0.02秒。
2、select * from bill order by time desc 。耗时5秒。
但现在的需求就是必须根据情况2来排序的,查询的速度太慢了。
是不是有什么解决方案啊

解决方案 »

  1.   

    没有用的,还是慢的不行。网上都是说建立索引。这种方法对order by 好像不行啊。哪位有没有测试过。
      

  2.   

    建索引的语句如下:
    create index ID_bill_SUBMIT on bill( time desc)
    基本上没有任何效率提升,真是郁闷。。
      

  3.   

    看执行计划是否使用了索引
    同时检查temp表空间是否不足,如果不足的话,排序可能不是在内存中进行的
      

  4.   

    xiaoxiao1984(潇潇):
    如何查看“执行计划是否使用了索引”?
      

  5.   

    FID是表bill的主键
    select * from bill
    select * from bill order by fid asc  
    效率差不多但是
    select * from bill where fdestaddr='13711112222' 
    select * from bill where fdestaddr='13711112222' order by fid asc 
    查询结果是没有数据的,第二条却要执行3秒,郁闷中。
      

  6.   

    你建的是降序索引
    select * from bill where fdestaddr='13711112222' order by fid asc 肯定会慢的;
    索引要跟你的排序规则相同;
    如果相同了还是慢,偶无言……
      

  7.   

    SELECT /*+ INDEX(BILL ID_bill_SUBMIT )*/
    * from bill order by time desc 上面的语句可以确保SQL在执行时用到INDEX。但是用到INDEX并不一定代表性能会提升。因为看不到你使用的其它条件,而且使用*作为检索内容总会引起较大的全表扫描。这样你使用INDEX反而会碍事。如果确定需要抽取表中的所有50万数据(不知道你们怎么设计的),那么不可避免的要产生较高的磁盘访问次数。此时查询的速度INDEX也是无济于事的。考虑升级你的硬盘,内存。优化该表存放的数据块吧!
      

  8.   

    默认的pl/sql developer是不会一次抽取50w的记录的.所以应该是抽取前面的n条,在这个情况下,系统直接读取前面的,所以速度很快.但是一旦涉及到排序,那么必定需要进行全表的扫描.自然需要消耗的时间是多很多的.这个就是为什么需要消耗那么多时间的缘故了.
      所以就是有一些优化,那么也不是有太多可以改进的办法.唯一的就是一次不要读取那么多,然后再排序.
      

  9.   

    在plsql 中,只需要按F5就可以看见执行计划了
    检查是否是table assess full(全表扫描)
    如果是全表扫描:
      确定表是否长时间没有进行分析,如果可能重新分析一下表;
      检查表的排序没有使用索引的原因,可能和一些设置或者语句有关;
      

  10.   

    select * from bill where fdestaddr='13711112222' 
    select * from bill where fdestaddr='13711112222' order by fid asc 
    对这两句表示质疑~ Oracle是先查询,再排序的, 所以这两句执行速度肯定相同
      

  11.   

    在程序里执行select * from bill;  和在PL/SQL工具中执行select * from bill; 时间完全不同,因为PL/SQL是只取了前面几条记录来显示,但程序里却要全表浏览~~
      

  12.   

    情况如下:
    表名称为BILL,里面有50万条记录,现在要查询这张表。在PL/SQL Developer中查询。测试语句如下:
    1、select * from bill。查询效率很快,只需0.02秒。
    2、select * from bill order by time desc 。耗时5秒。
    但现在的需求就是必须根据情况2来排序的,查询的速度太慢了。
    是不是有什么解决方案啊==============================实际上都是全表扫描的,后面主要是在排序。前面的不用排序是
    主要是物理存储上的问题
    物理存储是ROWID的
    如果你的经常ORDER BY TIME 建议物理存储按TIME降序来存储
      

  13.   

    如果数据量比较大,当执行order by 或group by等这些要对全表数据进行操作的时候当然会慢