索引的各种开销
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)