oracle中DateTime类型的字段,建立索引后,查寻时索引如何生效?请高手指教

在oracle的表里面有一个dateTime的字段,记录精确到秒,我给此字段建立索引之后,为什么在查询区间的时候只有在12个小时范围内,索引生效,超出即不生效如下面代码s... 在oracle的表里面有一个dateTime的字段,记录精确到秒,我给此字段建立索引之后,为什么在查询区间的时候只有在12个小时范围内,索引生效,超出即不生效
如下面代码
select * from act where id=2001
and cstart_time >= to_date('2011-7-1 02:00:00','yyyy-MM-dd hh24:mi:ss')
and cstart_time < to_date('2011-7-1 18:00:00','yyyy-MM-dd hh24:mi:ss')
若是这样,索引并不生效。
但如果把最后一句改成
and cstart_time < to_date('2011-7-1 14:00:00','yyyy-MM-dd hh24:mi:ss')
索引即生效。请高手指教,是不是我建立的索引有问题,还是在建立索引时对
datetime类型有限制?
展开
 我来答
c209zhang
2011-08-04 · TA获得超过1328个赞
知道小有建树答主
回答量:319
采纳率:0%
帮助的人:324万
展开全部
这就是ORACLE CBO优化器的聪明之处了。
在ORACLE 的官方文档有这样的话:
Create an index if you frequently want to retrieve less than about 15% of the
rows in a large table.
意思就是如果你检索的数据占整个表数据的15%以下的时候建索引。
也就是说一般情况下如果你查询的数据占表数据的15%以下的时候,用索引会比全表扫描效率高。如果超过15%的话可能就是全表扫描的效率更好!当然这个15%也不是固定的,也要根据不同情况来分!
而ORACLE 的CBO优化器会自动根据表的统计数据和你要检索的数据,去分析是用索引的效率更高还是全表扫描的效率更高。
如果一定要用索引的话,那就加个hints吧!
更多追问追答
追问
恩,感谢你的回答,我已经强制执行索引了。再追问一下。因为强制执行索引要写到SQL里面。
因为我的表每天早上要有大量数据写入,因此要先删除索引,之后再重新创建索引。故如果在删除索引的这段时间,执行SQL,此时无索引,程序是否出错?
追答
我觉得没什么问题,加个hints只是提示CBO优化器去使用索引,但是CBO也有可能不按照提示执行。不过没测试过,你可以先测试下。
还有我觉的先删除索引在重建索引的方式来写入大量数据的方式是不是麻烦点。虽然说没有索引插入会快点,但是重建索引也很需要资源啊,如果是插入的数据都是按dateTime来在现在的表中的日期以后的,是不会引起dateTime索引分割的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhenxin0603
2011-08-04 · TA获得超过600个赞
知道小有建树答主
回答量:600
采纳率:100%
帮助的人:454万
展开全部
用between 或<=
另外id建索引了吗,id没索引有可能也影响cstart_time的索引使用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
呵呵呵呵HHTT
2011-08-04 · TA获得超过382个赞
知道小有建树答主
回答量:371
采纳率:0%
帮助的人:271万
展开全部
为什么SQL里头没有order by 子句?
追问
有 order by cstart_time 没往上贴
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式