【INDEX】Oracle 索引常见知识梳理

索引的各种开销

1.访问集中导致热块争用

--eg,访问的数据都在同一个索引块上,导致热点索引争用
select * from t where t.id=9997; --9998/9999

2.回表

回表就是所查询列不在where条件的上,无索引。例如,在T表A列创建索引,但我们直接使用select *

--eg
select * from t where t.a=xx;

3.大量插入更新

如果一个表有很多索引,在索引列批量更新、插入会变慢。索引是有序的,大批量会造成索引块等待。

insert into t values ();
-or
update table t set a=xxx;

4.创建索引造成的开销

创建索引会造成全表锁;因为索引的有序,创建索引会引起全表排序

--如下面语句,造成锁
create index t_id_idx on t(a);

索引失效的原因

逻辑失效

  • 1.用索引代价更高,所以不使用索引。 一般是在返回大量数据时,不使用索引效率更好
  • 2.发生索引列的类型转换或者使用函数。to_char(a_date,’yyyy/mm/dd),或者varchar类型转换成number。
  • 3.对所有进行各种计算

物理失效

  • 1.long列调整导致索引失效
  • 2.move操作会导致索引失效
  • 3.分区表一些操作导致索引失效(如,truncate、drop分区导致全局索引失效。可加上update global indexes)
请使用浏览器的分享功能分享到微信等