我的表很简单:table X 中有一个varchar(6)的字段month,在table X 的month字段上加了一个normal类型的索引
但我在查询如下sql时,确用不到这个索引,依然是全表扫描:
select *
from X
Where X.month>='200701'
强制使用这个索引时,耗时比不使用索引还要长,oracle自动采用最优方案(不使用这个索引)。
我的问题是为什么采用索引比不使用索引还用忙,我这个sql有没有什么可以优化的地方?
但我在查询如下sql时,确用不到这个索引,依然是全表扫描:
select *
from X
Where X.month>='200701'
强制使用这个索引时,耗时比不使用索引还要长,oracle自动采用最优方案(不使用这个索引)。
我的问题是为什么采用索引比不使用索引还用忙,我这个sql有没有什么可以优化的地方?
解决方案 »
- select ||是什么意思~?
- 请教大家,怎么查询已有的DBLink??
- 從A表查找數據,字段卻在B表
- 各位高人,我的数据库不能启动了,请帮忙解决!!
- ORACLE 与SQL2000 连接
- 在oracle9i配置中如何限制远程用户(知道数据库ip地址、用户名和密码)?
- 我在系统(win2000server)上强制关掉进程ORACLE,结果重新启动后数据库就不能打开了?有什么办法可以解决的呀?!谢啦
- oracle的时间修改问题
- 散分问题:现在的机器上已有一个oracle 8i服务器了,我现在需要登录另一台机器上的oracle 8i服务器,我该怎么操作呢?谢谢,来者有分!!!!
- 在SQL>下怎样执行sql语句所查询出来的结果?
- 请问为什么sql loader导入CSV文件后产生日志文件不能追加?
- 我遇到比较难的统计
不用索引的根本原因是ORACLE在你给定的环境下(比如统计资料收集, 初始化参数设置), 认为全表扫描比索引扫描更快,所需执行的IO次数要少. 其次, 你需要了解全表扫描用的是SCATTER READ,就是批量读取,一次读取的块数为DB_MULTIBLOCK_READ_COUNT决定,好象是16个BLOCK, 而索引扫描(你的案例肯定是INDEX RANGE SCAN), 是一个索引块一个索引块的读.如果涉及的记录占的比重多,效率远没有把整表都读到内存快. 这就是为什么B-TREE索引需要访问记录是全表记录一个恰当小的比例(例如小于5%)的原因. 最后注意这个百分比没有定数, 不同的情况它的取值可大可小. 有时候即使是1%, 也不如用全表扫描. 这还得看这个索引的存储效率. 建议: 及时收集表及索引上的统计资料(dbms_stats包), 相信ORACLE的优化器, 去掉HINT. 就你给出的SQL,应该没什么好优化的. 不过记住千万不要忘了200701的引号.