索引通过存储列的排序值来加快对表中数据的访问速度,帮助数据库系统快速定位到所需数据,避免全表扫描
B树索引(B-Tree Index)
B树索引是一种平衡树结构,适合处理范围查询和精确查找。它的设计目标是保持数据有序,并支持高效的插入、删除和查找操作。是 Oracle 数据库中一种最常见的索引类型, 索引没有指定索引类型时默认是B树索引
语法 : 根据表中的某个字段创建索引
索引名命名规范: idx_表名_字段名
(不强制,只是相对规范,其他起名方式也可以)
位图索引(Bitmap Index)
主要用于处理低基数列(即列中唯一值较少的列,如性别、状态等)。位图索引通过使用位图(bitmap)来表示数据的存在与否,适合在数据仓库或决策支持系统(DSS)中使用,尤其是在需要处理大量静态数据和复杂查询的场景中。
语法
分区索引(Partitioned Index)
是与分区表(Partitioned Table)相关联的索引。分区表是将大表数据按某种规则(如范围、列表、哈希等)分成多个较小的分区(Partition),而分区索引则是为这些分区创建的索引。分区索引可以显著提高大表的查询性能,尤其是在数据量非常大的情况下。
分类
区别: 当表分区发生变化(如添加、删除、合并分区)时,本地分区索引会自动同步, 全局分区索引可能需要手动维护
语法
以上语法没有指定索引实现方式, 默认是B树索引
主键索引和唯一索引
主键索引和唯一索引通常都是使用B树索引来实现的, 通常不将主键索引和唯一索引指定为位图索引/哈希索引。
共同点:
1.唯一索引和主键索引都是用来保证数据的唯一性的;
2.都可以在建表时定义
区别:
1.主键索引不能包含NULL值, 唯一索引可以有NULL值且可以出现多次(因为NULL不等于任何值,包括它自己)。
2.一个表只能有一个主键索引,但可以有多个唯一索引
主键索引的语法
主键索引字段是单个时是单一主键索引, 字段有2个或以上时是复合主键索引
唯一索引的语法
联合索引/组合索引
指在多个列上创建的索引。它适用于查询条件中同时涉及多个列的场景, 默认属于B树索引,不支持直接将联合索引创建为哈希索引
索引(a , b , c) 有3个字段,相当于建了3个索引, 即索引(a) , 索引(a , b) , 索引(a, b , c)
联合索引的顺序影响查询效率,应根据查询频率和选择性设计索引。高选择性的列应放在前面
最左原则:
联合索引按从左到右的顺序匹配,查询条件必须包含最左侧的列,否则索引可能失效。例如,索引为 (A, B, C)
,查询条件应包含 A
,否则索引可能无法使用
如果联合索引是 (A, B, C)
,而查询条件是 A
和 C
(即缺少中间的 B
),联合索引部分有效
函数索引
基于表达式或函数创建的索引。它适用于查询条件中包含函数或表达式的场景, 常用于优化复杂的计算列查询以及大小写不敏感的查询, 默认属于B树索引, 不支持将函数索引直接指定为哈希索引
指定位图索引的语法
查看索引
查看索引信息
USER_INDEXES
视图包含了当前用户拥有的所有索引的信息
ALL_INDEXES
视图包含了当前用户有权限访问的所有索引的信息
DBA_INDEXES
视图包含了数据库中所有索引的信息。你需要有 DBA
权限才能访问这个视图。
查看索引包含的列
查看索引的储存信息
USER_SEGMENTS是一个系统视图, 用于描述当前用户所拥有的对象的段(Segment)的存储分配情况, 段是 Oracle 数据库中分配存储空间的逻辑单位,用于存储表、索引、分区、簇等对象的数据
索引选择:如果聚簇因子较高,CBO 可能会认为全表扫描的成本更低,从而选择全表扫描而不是索引扫描
查看索引的分区信息(如果索引是分区索引)
获取索引的DDL
通过对象面板查看索引
查看索引 : Tables>>表名>>查看
查看索引DDL: Tables>>表名>>DBMS_元数据(D)>>DDL
删除索引
授权sql
如果尝试删除一个不存在的索引,数据库会抛出一个错误
验证索引是否已删除
删除与约束相关的索引
如果索引是某个约束(如主键或唯一约束)的一部分,Oracle 会自动为该约束创建索引。这种情况下,不能直接删除索引,需要删除约束, 删除约束= 删除相应的索引
ALTER TABLE employee
DROP CONSTRAINT 约束名;
删除分区索引
直接使用 DROP INDEX
删除整个索引,或者删除特定的分区
ALTER INDEX 分区索引名称
DROP PARTITION 分区名;