DATE 类型上的索引

pldongdong 2009-06-04 11:00:15
Oracle 数据库

在DATE类型的列(sj)上建了索引
该字段的某些数据 2009-3-25 9:27:38
2009-3-25 9:27:38
2009-4-1 9:04:31

sql:
select * from table1 where sj>=to_date('****-**-** **:**:**','YYYY-MM-DD HH24:MI:SS')
and sj<=to_date('****-**-** **:**:**','YYYY-MM-DD HH24:MI:SS');

sql执行根本就没用到索引,
这是怎么回事,

请教各位高手我的sql怎么写才能让它用到索引

...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pldongdong 2009-06-04
  • 打赏
  • 举报
回复
大哥们 ,关注一下啊,谢谢
pldongdong 2009-06-04
  • 打赏
  • 举报
回复
谢谢各位
suncrafted 2009-06-04
  • 打赏
  • 举报
回复
Oracle
有两种执行优化器,一种是RBO(Rule Based Optimizer)基于规则的优化器,这种优化器是基于sql语句写法选择执行路径的;另一种是CBO(Cost Based Optimizer)基于规则的优化器,这种优化器是Oracle根据统计分析信息来选择执行路径,如果表和索引没有进行分析,Oracle将会使用RBO代替CBO;如果表和索引很久未分析,CBO也有可能选择错误执行路径,不过CBO是Oracle发展的方向,自8i版本来已经逐渐取代RBO

数据量在全表数据的10%以上,有可能走的是全表扫描,而不走索引。

所以,建了索引,不会一定使用索引。
manchun 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 pldongdong 的帖子:]
Oracle 数据库

在DATE类型的列(sj)上建了索引
该字段的某些数据 2009-3-25 9:27:38
2009-3-25 9:27:38
2009-4-1 9:04:31

sql:
select * from table1 where sj>=to_date('****-**-** **:**:**','YYYY-MM-DD HH24:MI:SS')
and sj <=to_date('****-**-** **:**:**','YYYY-MM-DD HH24:MI:SS');

sql执行根本就没用到索引,
这是怎么回事,

请教各…
[/Quote]

1,把你的>=去掉,换成>

2,你看下你的执行计划,数据量在全表数据的10%以上,有可能走的是全表扫描,而不走索引。
hebo2005 2009-06-04
  • 打赏
  • 举报
回复
1、字段上要有索引
这个看样子不成问题

2、所筛选的数据占总数据量在百分比比较少,例如10%以下
如果占比过大,就会走索引,而用全表扫描,最有可能是这个原因
比如你一共就一个月的数据,条件就限制了一个月,就必定是全表扫描


inthirties 2009-06-04
  • 打赏
  • 举报
回复
把你的执行计划贴出来看看.


==================================================================
Inthirties关注Oracle数据库 维护 优化,安全,备份,恢复,迁移,故障处理

如果你需要帮助或想和我一起学习的请联系
联系方式QQ:370140387
电子邮件:dba@Inthirties.com
网站: http://www.inthirties.com
pldongdong 2009-06-04
  • 打赏
  • 举报
回复
自己顶一下

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧