ORACLE为什么不走主键索引缺走普通的索引?

lang3huan 2016-01-06 01:54:09
表DINV_HDR,子表大概5 6个,大概800W数据,
主键SHOP_CODE,COUNTER,INV_NUM, 类型CHAR(10),CHAR(5),CHAR(30)
增加索引:SHOP_CODE,COUNTER,INV_RUNNO, INV_RUNNO字段类型NUMBER(12)

当我查询 SELECT * FROM DINV_HDR WHERE SHOP_CODE='001' AND COUNTER='001' AND INV_NUM='10401-001' 时,走的是增加的索引,缺不是主键索引

1.重新收集统计信息,
2.重新编译所有主键,索引,
3.导出DMP之后换一台机重新导入走主键索引,
4.如果WHERE条件增加空格走主键索引
例如SHOP_CODE='001 ' AND COUNTER='001 ' AND INV_NUM='10401-001 ' ;

请帮忙分析下什么原因
...全文
653 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhdz_bj 2016-01-06
  • 打赏
  • 举报
回复
1、数据越多,索引的大小差别越大。 2、你说的效率不咋样怎判断的?也就是看到结果的时间吧,效率判断的标准不同,所以,结果也不一样。就像团队赛,是按第一个人跑到终点判断,还是所有人跑到终点判断,结果也不一样。
lang3huan 2016-01-06
  • 打赏
  • 举报
回复
引用 1 楼 LHDZ_BJ 的回复:
1、数据库选择执行计划,是以cost为标准的,也就是指选择cost最低的。 2、你这里定义的三个主键字段都是char,这意味着后面补足空格。这样,你原来的SQL条件里的值并不能和主键索引里的键值精确匹配,同时普通索引比主键索引要小,同时,这个SQL注定走哪个索引也是要回表的,所以走了普通索引。 3、你在SQL条件里加空格后,优化器认为这样的条件能精确匹配主键索引的值,所以,走了主键索引。 4、你这样定义字段类型,现实中还是会出现问题的,如果字段实际值达不到定义的宽度,就会补足空格,这样,你在应用中会遇到类似问题,建议改成varchar2试试。
随着数据增长才走的普通索引(最早是主键索引),但是我导入到其它电脑走的就是主键索引, 虽然普通索引cost是低,但是效率不咋样
lhdz_bj 2016-01-06
  • 打赏
  • 举报
回复
1、数据库选择执行计划,是以cost为标准的,也就是指选择cost最低的。 2、你这里定义的三个主键字段都是char,这意味着后面补足空格。这样,你原来的SQL条件里的值并不能和主键索引里的键值精确匹配,同时普通索引比主键索引要小,同时,这个SQL注定走哪个索引也是要回表的,所以走了普通索引。 3、你在SQL条件里加空格后,优化器认为这样的条件能精确匹配主键索引的值,所以,走了主键索引。 4、你这样定义字段类型,现实中还是会出现问题的,如果字段实际值达不到定义的宽度,就会补足空格,这样,你在应用中会遇到类似问题,建议改成varchar2试试。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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