我有一个问题,说起来挺简单的,有一个表,表里面大概有20多个字段,其中有一个字段叫
FSUBMITTIME,另一个字段ID,ID是自动增加的NUMBER类型,FSUBMITTIME保存的是TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')值,还有一个字段FSTATE,NUMBER类型,标志为,标志是否已经被处理过,只使用0或者1,我的查询语句是这样的
SELECT * FROM TABLE1 WHERE FSTATE=0 ORDER BY FSUBMITTIME DESC, ID ASC这句本也没什么问题,但是我发现当表内数据超过2万的时候,程序的检索速度(单条)明显变慢了,超过4万,又慢了很多 ,现在假设里面一个字段都没有,我希望SELECT的效率变得更高.希望大家给个方法,假设目前没有任何索引..

解决方案 »

  1.   

    SELECT * FROM TABLE1 WHERE FSTATE=0 ORDER BY FSUBMITTIME DESC, ID ASC
    可以考虑一下在id上建索引,然后order by id asc,fsubmittime desc试试
    还有一点就是把*号改成你想要取出的列名。因为查询语句执行时oracle要把*转换成表的所有列名,就会影响查询的效率
      

  2.   

    ORDER BY FSUBMITTIME DESC, ID ASC与order by id asc,fsubmittime desc语义上显然不一样,呵呵。
    不过,使用具体的列名是必然的。
    在fsubmittime上肯定要创建索引了。
    然后还要在fstate字段上建立bitmap索引,以提高该字段上的检索效率。
    create bitmap index idx_table1_fstate on table1(fstate);
      

  3.   

    1.列出具体需要的列名
    2.对fstate索引
    3.如果能不要order by 就尽量不要使用
      

  4.   

    不要用select *, 具体列出来。
    id 是自动增加,没必要索引了吧。在fstate上建索引。 
    搂主那句sql没必要用order by 吧!
      

  5.   

    如果该表经常进行更新、删除操作的话,建议不要在FSTATE字段上建立位图索引;
    可以在FSUBMITTIME字段上建立降序索引,在ID列上建立升序索引;
    同时考虑是否有必要一次进行这样的查询:
    SELECT * FROM TABLE1 WHERE FSTATE=0 ORDER BY FSUBMITTIME DESC, ID ASC
    可以调整成,一次只查询100条或者固定的条数,通过翻页来查询更多的记录
    select b.col, rid from (select a.col, rownum as rid from (select * from TABLE1 WHERE FSTATE=0 ORDER BY FSUBMITTIME DESC, ID ASC)a where rownum < 300 )b where rid >=200;
      

  6.   

    如果这个表在没有索引的情况下,根据经验是Order By的问题引起的,以前我们开发的一个系统(SQL Server的数据库)就是因为Order By引起了较严重的性能问题。如果没有必要最好去掉这个Order By子句,特别是在数据量大的时候。
      

  7.   

    1:数据表数据过大
    2:增加索引,列出具体的列,去除ORDER BY
    3:机器本身性能不高,提高机器性能.