如题:
现在是单表根据时间查询,速度10000条数据需要30s左右,如何提高查询速度?

解决方案 »

  1.   

    如果返回的记录数占总记录数的4%以内,则在查询条件上加索引速度快,如果返回的记录数超过了总记录数的4%,则全表扫描快,我印象中应该是4%.
    要提高全表扫描的速度,就要加大DB_FILE_MULTIBLOCK_READ_COUNT这个参数值,其方法为
    ALTER SYSTEM SET DB_FILE_MULTIBLOCK_READ_COUNT = 100;
    这个单位是个块数,每次IO的数据量就是DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT了.
      

  2.   


    1,表数据量有多大?2,时间字段建了索引没有?3,判断的时候,对时间字段的处理是在=><符号左边还是右边?兄弟,你还是把sql语句贴出来,大家帮你看下
      

  3.   


    oracle里面是8%吧,sqlserver是10%吧?怎么会是4%呢?
      

  4.   


    关于返回数据量占记录总数的百分比为多大时应该创建B树索引的问题,tom在他的书中有一个说法,根据他的说法,我们都不对啊,呵呵。一般来讲,B*树索引会放在频繁使用查询谓词的列上,而且我们希望从表中只返回少量的数据(只占很小的百分比),或者最终用户请求立即得到反馈。在一个瘦(thin)表(也就是说,只有很少的几个列,或者列很小)上,这个百分比可能相当小。使用这个索引的查询应该只获取表中2%~3%(或者更少)的行。在一个胖(fat)表中(也就是说,这个表有很多列,或者列很宽),百分比则可能会上升到表的20%~25%。以上建议不一定直接适用于每一个人;这个比例并不直观,但很精确。文章出处:http://www.diybl.com/course/7_databases/oracle/oraclexl/2008126/97567.html通过搜索上面出现的文字可以进入到这段。
      

  5.   

    我的sql语句是这样写的:
    SELECT *
      FROM FIN.INVOICES VOS
     WHERE TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd') BETWEEN '20080101' AND
           '20090101'
       AND ROWNUM <= 10000
      

  6.   


    嗯,看到了,有机会去实践下,就是不知道如何去实践下tom的说法啊?
    楼上的兄弟有实践的思路不?
      

  7.   


    我知道原因了,慢在这里:TO_CHAR(VOS.PRINT_DATE, 'yyyymmdd')因为用了TO_CHAR函数,索引失效了,走全表扫描。建议你这个判断换种方法可以不?别在左边用函数对字段处理,在betweed后面进行处理,试下吧,兄弟!
      

  8.   

    我计算了一下,这个应该是走全表扫描快,我建立的索引就是基于TO_CHAR函数的,而且执行计划就是按照索引查询的,但是速度就是不如全表扫描快
      

  9.   


    不会吧,你就2个条件啊,还有另外一个条件ROWNUM <= 10000 ,你去掉试试。消耗的时间怎么样啊?
      

  10.   


    我是这样想的,建两个表,一个thin的,一个fat的,thin的就两个字段, fat的50个字段,然后insert数据,
    可以用dba_objects反复做,当然也可以用rownum自己加一个主键,然后查询测试即可.
      

  11.   

    ROWNUM <= 10000 ,你看你查的数据<10000啊,还没有到10%呢,干嘛要走全表扫描呢? 小数据量走索引扫描会快些吧!
      

  12.   


    那只能说你自己看书不仔细,tom从来就没有说过8%一说,  因为这个需要根据实际情况来定的.有时候可能20%都有可能,有时候可能8%都不行,那是因为你的表的大小,行的大小,blocksize的大小都有很大的关系的.再说了,建议你还是把tom讲索引的那一章看完了再来说话