数据库索引走错?

linuxlsx 2010-11-11 07:19:26
前段时间参加了淘宝的面试,面试官问我有没有碰到过Oracle索引走错的问题。当时想索引还会走错。我是没有碰到过这样的情况,不知有哪位大牛碰到过。有的话说下原因咯
...全文
130 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ngx20080110 2010-11-12
  • 打赏
  • 举报
回复
隨著數據的增加,索引的效率可能會下降,這時Oracle可能就不會走索引,需要重建索引
MythColor 2010-11-12
  • 打赏
  • 举报
回复
我估计面试官是想说在CBO的情况下,某些时候优化器选择的索引并不是最佳路径,导致性能低下,有很多原因导致这种情况,常见的有:
1.数据分布不均匀,需要收集直方图给CBO做进一步参考
2.SQL较复杂,连接的表太多(比如10个以上),CBO无法列举所有连接路径并比较开销。这种情况最好手动添加hint指定驱动表或者索引。
47522341 2010-11-12
  • 打赏
  • 举报
回复
索引会经常走错
1,糟糕的编写习惯;
2,cbo环境下的统计信息过旧;
3,没有正确的索引;
4,db_file_mulity_block_read_count设置问题
等等。
iihero 2010-11-11
  • 打赏
  • 举报
回复
有时候,极个别的情况,出现索引数据与表数据不匹配的情况。这时候,需要重建索引。
  • 打赏
  • 举报
回复
不知道是不是指不走索引
建立了索引,在查询语句中使用了索引字段 但是不走索引的可能

1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。
3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生
隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5,此时不走索引的情况类似于case3。日期转换也有类似问题,如:
select * from t where trunc(date_col) = trunc(sysdate)其中date_col为索引列,这样写不会走索引,可改写成select * from t where date_col >= trunc(sysdate)
and date_col < trunc(sysdate+1),此查询会走索引。
5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读,
当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。

6、<>

7、like’%dd’百分号在前

8、not in ,not exist.

17,382

社区成员

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

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