dbms_stats分析表后,查询不走索引了

PatternAabcc 2009-08-03 03:19:49
select * from ipinfo where startip < ip and endip > ip

建组合索引 (startip,endip)后,查询走索引且 cost cardinality bytes 都正常

但 执行 dbms_stats后
exec dbms_stats.gather_table_stats(ownname => 'user',tabname => 'ipinfo',method_opt => 'for all indexed columns',cascade => true);

非但不走索引, cardinality bytes 都 异常的大

求原因 和 恢复方法 谢谢!
...全文
201 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
majy 2009-08-03
  • 打赏
  • 举报
回复
只要你的where条件查出来的数据是唯一的,那么oracle就会自动帮你用唯一索引的

你泊条件中,使用了>和<这种符号,那么检索结果是唯一的可能性是很小的,oracle也只能这样了

你的语句中你为什么要select *呢?你只把你需要的字段选出来就可以了啊

为了加快速度,你可以把要seelect来的字段也放到索引里去,做成一个复合索引,这样,速度会快很多
PatternAabcc 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 majy 的回复:]
删除统计信息后,你强行指定用CBO的话,oracle就开始乱估算了,你想想,基础数据都没了,算出来的东西还能准确吗?
[/Quote]

原来如此...


请问 如果我确定 此 SQL语句 必定只返回一条记录(即 startip 跟 endip 都可以加 唯一索引)

请问 这句SQL 能 优化吗? 存储过程大部分时间都耗在这句上面了......
majy 2009-08-03
  • 打赏
  • 举报
回复
删除统计信息后,你强行指定用CBO的话,oracle就开始乱估算了,你想想,基础数据都没了,算出来的东西还能准确吗?
PatternAabcc 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kaoziji 的回复:]
lz,SQL中的startip,ip,endip都是列名?
[/Quote]

ip 占位符
kaoziji 2009-08-03
  • 打赏
  • 举报
回复
lz,SQL中的startip,ip,endip都是列名?
PatternAabcc 2009-08-03
  • 打赏
  • 举报
回复
结果集 就 1个,全表记录 只有 三万六千多条。
PatternAabcc 2009-08-03
  • 打赏
  • 举报
回复
太感谢了,确实 走了索引以后 时间更长了,但为什么删掉 统计信息后 执行计划的 3个指标会变小那么多呢?
但执行时间仍然很长.......



无stats计划
SELECT STATEMENT, GOAL = ALL_ROWS Cost=4 Cardinality=2 Bytes=214
TABLE ACCESS BY INDEX ROWID Cost=4 Cardinality=2 Bytes=214
INDEX RANGE SCAN Cost=3 Cardinality=1



有stats计划
SELECT STATEMENT, GOAL = ALL_ROWS Cost=44 Cardinality=7242 Bytes=202776
TABLE ACCESS FULL Cost=44 Cardinality=7242 Bytes=202776




执行时间大约 有stats比无stats 快 3倍
kaoziji 2009-08-03
  • 打赏
  • 举报
回复
把没有stats时的执行计划、有stats后的执行计划贴出来。
在有stats的状态下,用hint指定走index的执行计划也贴出来。
majy 2009-08-03
  • 打赏
  • 举报
回复
cardinality 非常大,说明符合条件的结果集非常大,所以,用全表检索更划算
majy 2009-08-03
  • 打赏
  • 举报
回复
说明全表检索比走索引快啊,你测试一下结果就知道了,并不是用索引就好的

你的结果集的记录数是多少,全表的数据有多少记录?
PatternAabcc 2009-08-03
  • 打赏
  • 举报
回复
我把 统计信息都删了 以后 又正常了,求原因。
yangyt 2009-08-03
  • 打赏
  • 举报
回复
exec dbms_stats.gather_table_stats(ownname => 'user',tabname => 'ipinfo',cascade => true);

17,377

社区成员

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

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