索引的分类
逻辑分类:
单列和多列:
单列索引(single column):对单列数据建立索引。
复合索引(concatenated):对多列数据建立索引。
唯一性:
唯一性(unique):建立的key值唯一。
非唯一性(nonumique):不唯一。
(function-based):在列上应用函数或表达式创建的索引。
(domain):用于用户定义的数据类型,通常需要自定义操作符或索引逻辑。
物理分类:
分区:
分区(partitioned):对大表分区存储,并为每个分区分别创建索引。
不分区(nonpartitioned):
B树(B-tree):最常用的索引类型,基于平衡 B-树结构存储,适合高基数(列中值较多)的数据。
位图索引(Bitmap):使用位图存储数据,适合低基数(列中值较少)的数据。
索引的结构
索引本身在oracle操作中不被直接引用。
索引本身是排序的,查找数据时先查找根节点,找到大致范围,再查询对应分支节点,再查询子节点找到rowid,确定数据的具体位置。
在底层的叶子节点间,组成了双向链表。
B-tree Index(B树索引)
B树是平衡树,root为根节点,branch为分支节点,leaf为叶子节点,每个节点相当于一个块。
所有index entry都存储在叶子节点中,每一个index entry对应着一条记录。
Key column length:key的长度
Key column value:key的值
ROWID:唯一值,相当于指针
Bitmap Index(位图索引)
适用条件:
当某列取值只有固定的几个值时
每个叶子节点存储信息的固定格式:
<key(j键值), start ROWID(起始ROWID) , end ROWID(终止ROEID) , bitmap(01字符串,0代表不是,1代表是)
优点:
计算速度快。
B树 (B-tree) | 位图 (Bitmap) |
---|---|
适合高基数列 | 适合低基数列 |
更新键相对便宜 | 更新键列非常昂贵 |
对使用OR谓词的查询效率低下 | 对使用OR谓词的查询效率高 |
适用于OLTP | 适用于数据仓库 |
创建索引
索引独立于表,有自己单独的存储位置
CREATE [UNIQUE] [BITMAP] INDEX index_name ON table_name(column1 [ASC|DESC], column2 [ASC|DESC], ...) [TABLESPACE tablespace_name] [PCTFREE n] [INITRANS n] [MAXTRANS n] [STORAGE];
UNIQUE
用于创建唯一索引,确保列中的值是唯一的。
适用于主键(PRIMARY KEY)或唯一约束(UNIQUE CONSTRAINT)。
BITMAP
指定创建位图索引,仅在支持位图索引的数据库(如 Oracle)中可用。
适合低基数列。
index_name
索引的名称,必须在同一模式下唯一。
通常使用命名规则,如
表名_列名_idx
。
table_name
表的名称。
column1, column2
指定索引列,可以单列或多列。
每列可以指定
ASC
(升序)或DESC
(降序),默认是升序。
TABLESPACE tablespace_name
指定索引存储的表空间(仅在 Oracle 中需要)。
PCTFREE n
定义索引块中的可用空间百分比。
值范围为
0
到99
,默认是10
(表示索引块预留 10% 空间用于更新)。
INITRANS n
定义索引块中初始分配的事务槽数量。
n
的默认值通常是 2。
MAXTRANS n
定义索引块中允许的最大事务数。
该值限制事务槽的最大数量。
[STORAGE]
指定索引的存储参数。
控制索引的物理存储特性,包括初始大小、增长方式等。
常见参数:
INITIAL
:分配的初始存储空间。NEXT
:每次扩展的存储空间。PCTINCREASE
:每次扩展时的增长百分比。MINEXTENTS
和MAXEXTENTS
:指定最小和最大扩展数量。
重构索引
ALTER INDEX index_name STORAGE ( INITIAL size NEXT size PCTINCREASE percentage MINEXTENTS n MAXEXTENTS n );
重新构建索引(REBUILD)
普通重建:
ALTER INDEX index_name REBUILD [TABLESPACE tablespace_name];
在普通重建过程中,索引及其对应的表会被完全锁定,不能进行任何 DML 操作(如
INSERT
、UPDATE
、DELETE
)。
在线重建:
ALTER INDEX index_name REBUILD [TABLESPACE tablespace_name] ONLINE;
在重建过程中,允许用户对表进行查询和数据修改(DML),仅在索引重建的开始和结束阶段有短暂锁定。
普通重构的过程
1.锁定表。
2.通过读取现有索引的内容创建一个新的临时索引。
3.删除原始索引。
4.重命名临时索引,使其看起来像原始索引。
5.移除表锁。
在线重构的过程
1.锁定表。
2.创建一个新的、临时的空索引,并创建一个 IOT(索引组织表)来存储正在进行的 DML 操作。
3.释放表锁。
4.通过读取现有索引的内容填充临时索引。
5.将 IOT 的内容合并到新索引中。
6.锁定表。
7.进行 IOT 的最终合并并删除原始索引。
8.重命名临时索引,使其看起来像原始索引。
9.移除表锁。
Coalescing Indexes(合并索引)
Coalescing Indexes(合并索引)是 Oracle 数据库中优化索引的一种方法,其目的是减少索引的碎片,优化空间利用,同时保持索引的可用性。
语法
ALTER INDEX index_name COALESCE;
合并索引 vs 重建索引
特性 | 合并索引(Coalesce Index) | 重建索引(Rebuild Index) |
---|---|---|
影响可用性 | 不影响(表和索引可用) | 可能锁定表(普通重建会锁定表) |
操作范围 | 仅合并叶块,无需重建整个索引 | 重建整个索引 |
碎片清理 | 减少碎片,但不清理整个索引 | 清理整个索引 |
性能消耗 | 较低 | 较高 |
适用场景 | 空间优化,尤其是分区索引 | 索引整体性能优化或表空间调整 |
检查索引的有效性(Index Validity)
确保索引没有损坏并且能够正常工作。
ANALYZE INDEX index_name VALIDATE STRUCTURE;
相关结果会存储在数据字典视图
INDEX_STATS
中。
执行完命令后,可以通过以下查询检查结果:
SELECT * FROM INDEX_STATS;
删除索引
DROP INDEX index_name;
不会影响表数据:删除索引仅移除索引结构,表中的数据不会被删除。
检查依赖性:
索引删除时,与之相关的唯一性约束或主键约束也会被删除(需谨慎)。
如果索引是自动创建的(如主键或唯一性约束的隐式索引),应先删除约束,再删除索引。
表锁定:删除索引可能导致表的短暂锁定。
识别未使用的索引(Identifying Unused Indexes)
dentifying Unused Indexes(识别未使用的索引)是数据库优化的重要步骤,可以帮助减少存储空间、降低维护成本并提升整体性能。
1.启用索引监控
ALTER INDEX index_name MONITORING USAGE;
2,运行一段时间
保持监控开启,通常建议运行几天到几周,确保监控期间涵盖了所有典型的业务操作。
3.查看索引使用情况
查询 V$OBJECT_USAGE
视图检查索引是否被访问。
SELECT INDEX_NAME, TABLE_NAME, MONITORING, USED FROM V$OBJECT_USAGE WHERE INDEX_NAME = 'index_name';
4.停止索引监控 一旦完成监控,可以关闭监控功能。
ALTER INDEX index_name NOMONITORING USAGE;
相关视图
DBA_INDEXES
:
提供数据库中所有索引的相关统计信息,包括索引的类型、状态、存储位置和其他重要属性。
常用字段
INDEX_NAME:索引名称。
TABLE_NAME:索引所关联的表名。
INDEX_TYPE:索引类型(如
NORMAL
、BITMAP
、FUNCTION-BASED NORMAL
)。UNIQUENESS:是否唯一索引(
UNIQUE
或NONUNIQUE
)。STATUS:索引的状态(
VALID
或UNUSABLE
)。TABLESPACE_NAME:索引存储的表空间。
BLEVEL:索引的 B-树层级(越小性能越好)。
NUM_ROWS:索引所覆盖的表中行数。
DBA_IND_COLUMNS
:
提供每个索引的列信息,用于详细描述索引的结构
常用字段
INDEX_NAME:索引名称。
TABLE_NAME:索引对应的表名。
COLUMN_NAME:索引使用的列名。
COLUMN_POSITION:列在索引中的位置(多列索引时列的顺序)。
DESCEND:列是否以降序存储(
ASC
或DESC
)。
X$OBJECT_USAGE
:
X$OBJECT_USAGE
是 Oracle 的内部动态性能表,用于跟踪索引的使用情况(与 V$OBJECT_USAGE
密切相关)。
常用字段
INDEX_NAME:索引名称。
OBJECT_ID:对象 ID。
USED:索引是否被使用(
YES
或NO
)。MONITORING:是否正在监控索引使用情况(
YES
或NO
)。