奇怪,用了索引反而变慢了?

sgchen 2010-03-24 02:44:24
现有一个表th_messageinfo,表中大概有100多万数据,在测试索引的时候发现一个奇怪的问题
语句如下:
SELECT distinct target_id,built_time,mileage
FROM (
SELECT target_id,built_time,mileage
FROM th_messageinfo
WHERE built_time >= 1254067200
AND built_time <= 1254153599) a
查看解释计划如下:
Description 对象所有者 对象名称 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 849 1697 263035
SORT UNIQUE 849 1697 263035
TABLE ACCESS FULL SYSTEM TH_MESSAGEINFO 801 1697 263035

执行时间是6.797秒

创建索引:
create index i_th_messageinfo_3 on th_messageinfo(built_time);

查看解释计划如下:
Description 对象所有者 对象名称 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 54 1697 263035
SORT UNIQUE 54 1697 263035
TABLE ACCESS BY INDEX ROWID SYSTEM TH_MESSAGEINFO 6 1697 263035
INDEX RANGE SCAN SYSTEM I_TH_MESSAGEINFO_3 2 3054

但是执行时间竟然用了69.047秒

请教高手这是为什么?
...全文
294 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarkusVIP 2010-03-24
  • 打赏
  • 举报
回复
使用索引的基本准则:
当任何单个查询要检索的行少于或等于整个表行数的10%时,索引就非常有用。换句话说,其它情况使用索引可能会起到反作用!
vber1010 2010-03-24
  • 打赏
  • 举报
回复
有这回事啊 学习!
tangren 2010-03-24
  • 打赏
  • 举报
回复
一般来说,如果选择的记录数是总记录的25%以下,索引是有效果的。
suiziguo 2010-03-24
  • 打赏
  • 举报
回复
这就对了啊。

此时,全表扫描更快。
sgchen 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 suiziguo 的回复:]
索引不是万能的。

当返回数据占表总数据量比例大时,ORACLE宁愿选择全表扫描!
[/Quote]

但现在是选择了索引,但执行时间更长呀
suiziguo 2010-03-24
  • 打赏
  • 举报
回复
索引不是万能的。

当返回数据占表总数据量比例大时,ORACLE宁愿选择全表扫描!

17,377

社区成员

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

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