我有一个问题,说起来挺简单的,有一个表,表里面大概有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的效率变得更高.希望大家给个方法,假设目前没有任何索引..
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的效率变得更高.希望大家给个方法,假设目前没有任何索引..
解决方案 »
- oracle 没有dba权限,如何杀掉死锁的进程。
- oracel数据库正则表达式查询问题
- 怎么从归档模式变成非归档模式,请高手写详细点!
- 刁钻SQL单表复杂查询,请教各位高手!
- rownum和order by哪个先执行
- 上亿条记录,表的设计问题,请教!!!!!
- oracle定时作业的新问题。高手请进
- 我的ora8i中有个两个数据库A、B,我在oem中移去了一个A,在磁盘上A的文件没有删除。现在OEM里面只有B库了,我想把
- sql的问题,下面是。。。。。。。。。。。。。?哈哈哈,光临了,来着有分了保证!!
- ORACLE查询不同设备某一时间段内焊接工件数量,查询语句怎么写?
- PL/SQL问题 查询出一段时间里最新的记录
- 网上的sqlplus程序有问题
可以考虑一下在id上建索引,然后order by id asc,fsubmittime desc试试
还有一点就是把*号改成你想要取出的列名。因为查询语句执行时oracle要把*转换成表的所有列名,就会影响查询的效率
不过,使用具体的列名是必然的。
在fsubmittime上肯定要创建索引了。
然后还要在fstate字段上建立bitmap索引,以提高该字段上的检索效率。
create bitmap index idx_table1_fstate on table1(fstate);
2.对fstate索引
3.如果能不要order by 就尽量不要使用
id 是自动增加,没必要索引了吧。在fstate上建索引。
搂主那句sql没必要用order by 吧!
可以在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;
2:增加索引,列出具体的列,去除ORDER BY
3:机器本身性能不高,提高机器性能.