我的表有5000W的数据,建了5个索引,有一个索引感觉没起什么作用,各位大侠帮忙看看
表部分字段:
FLAG  varchar2(2)   
TIME_STAMP varchar2(14)  --存放的时间,格式:yyyymmddhh24miss

。flag字段和time_stamp字段都单独建有索引,当FLAG单独作为查询条件的时候查询速度在3秒左右,但用time_stamp单独作为条件查询是,就得要近3分钟才能出数据,非常不解。因为现在是测试,只有5天的数据,差不多1天1000万,我想知道在不建立表分区的情况下,应该怎么做优化,提高查询速度我用的是ORACLE11G,第二版

解决方案 »

  1.   

    那只能说明
    FLAG 字段的重复数据比较少,索引起到了作用。
    TIME_STAMP 字段的重复数据较多,索引没起作用。或者说有可能你建的索引是一个普通的索引但是你在写where条件的时候写成了
    to_date(TIME_STAMP,'yyyymmddhh24miss') = xxxx;
    这样会导致索引实效。
      

  2.   

    写where条件的时候是time_stamp >'20110826000000'或者是time_stamp<某一个值,没有做时间转换
    重复的数据flag字段比time_stamp字段要多,flag只有3中状态,time_stamp是以秒为单位,每一个以秒为单位的时间段大概有300条数据
      

  3.   


    这么多索引,维护成本估计也不小。 如果表上的insert 和update 事务很多, 速度也会受影响。是否走索引,SQL 的性能怎么样,可以通过执行计划来查看。Oracle 执行计划(Explain Plan) 说明
    http://blog.csdn.net/tianlesoftware/article/details/5827245
      

  4.   

    因为time_stamp字段是varchar2格式的,所以你使用time_stamp >'20110826000000'是不会走索引的,效率当然慢了。
    如果你经常使用大于、小于来查询,则需要把这个字段创建成date类型的,或者是nunmber的也成,这样才能使用索引。
    建议你去看下关于oracle索引的文章,了解下使用方法。
    另,flag上是不是建立的是位图索引?否则不会快的