聊聊数据库索引
索引是一块物理空间,会占用数据库的空间
索引氛围B树索引和位图索引,下图为B树索引
一般SQL优化有几种解决方案:
1.索引(index)
2.分区(partition)
3.物化视图
4.并行查询
索引的说明和目的
索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,银帆的DML操作反而会引起大量的索引维护
如果SQL语句仅访问被索引的列,那么数据库只需从索引中读取数据,而不用读取表,
如果该语句同时非要访问除索引列之外的列,那么,数据库会使用rowid来查询表中的行
通常,为检索表数据,数据库以交替方式先读取索引块,然后读取相应的表块。
索引的目的是:
主要是减少IO,这是本质,这样才能体现索引的效率。
1.大表,返回的行数<5%
2.经常使用where字句查询的列
3.离散度高的列
4.更新键值代价低
5.逻辑and、or效率高
6.查看索引建在那张表、列:
select * from user_indexes;
select * from user_ind_columns;
索引的问题:
索引碎片问题:由于对基表做DML操作,导致索引块的自动更改操作,尤其是基表的delete操作会引起index表的index_entries的逻辑删除,注意只有当一个索引块中的全部index_entry都被删除了,才会把这个索引块删除,索引对基表的delete、insert操作都会产生索引碎片问题。
- *
**
Oracle建议通过Segment、Advisor解决表和索引的对骗问题,如果你想自行解决,可以通过查看index_stats视图,当一下三种情形之一发生时,说明积累的碎片应该整理了
1.HEIGHT >= 4
2.PCT_USERD < 50%
3.DEL_LF_ROWS / LF_ROWS > 0.2
分析索引:
–通过analyze语句分析索引后,会将相关信息存入到 index_stats表中;
analyze index ind_1 validate structure;
–查询当前索引状况
select name,HEIGHT,PCT_USERD ,DEL_LF_ROWS/LF_ROWS FROM index_stats;
–可通过下列语句 online 整理索引碎片,整理完成以后,需重新分析索引,然后在index_stats表中可以查看整理后的状态
after index ind_1 rebuild [online] [tablespace name];
