oracle-索引

oracle-索引

  • 索引的概念
  • 普通索引
  • 唯一索引
  • 复合索引
  • 反向键索引
  • 位图索引
  • 什么时候创建索引
  • 什么时候不要创建索引
  • 查询索引
  • 删除索引

索引的概念

  • 一种独立于表的模式对象, 可以存储在与表不同的磁盘或表空间中
  • 索引被删除或损坏, 不会对表产生影响, 其影响的只是查询的速度
  • 索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引。用户不用在查询语句中指定使用哪个索引
  • 在删除一个表时,所有基于该表的索引会自动被删除
  • 通过指针加速 Oracle 服务器的查询速度
  • 通过快速定位数据的方法,减少磁盘 I/O

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次
数,从而提高数据访问性能。
索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于
下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提
到的伪列(ROWID)
oracle-索引_第1张图片
oracle中表的id查询比其他字段查询快,是因为创建表时候,主键id创建了索引,加快了查询速度

普通索引

  • 自动创建: 在定义 PRIMARY KEY UNIQUE 约束后系统自动在相应的列上创建唯一性索引
  • 手动创建:用户可以在其他列上创建非唯一的索引,以加速查询
  • 在一个或多个列上创建索引
create index 索引名称 on 表名(列名);

在表dept的dname上创建索引

-- 创建普通索引
create index deptno_index on dept(dname);

唯一索引

如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可
以创建唯一索引。

create unique index 索引名称 on 表名(列名);

需求:在业主表的水表编号一列创建唯一索引

create unique index index_owners_watermeter on
T_OWNERS(watermeter);

复合索引

我们经常要对某几列进行查询,比如,我们经常要根据学历和性别对学员进行搜
索,如果我们对这两列建立两个索引,因为要查两棵树,查询性能不一定高。那
如何建立索引呢?我们可以建立复合索引,也就是基于两个以上的列建立一个索
引 。

create index 索引名称 on 表名(列名,列名.....);
--创建复合索引
-- 根据地址和门牌号对学员表创建索引,语句如下:
-- 索引的列放在前面,查询的时候优先使用那一列
create index index_owners_ah on t_owners(addressid,housenumber);

反向键索引

应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子
树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变
得不规则,从而使索引树能够均匀分布

create index 索引名称 on 表名(列名) reverse;

oracle-索引_第2张图片

位图索引

使用场景:位图索引适合创建在低基数列上
位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射
优点:减少响应时间,节省空间占用

create bitmap index 索引名称 on 表名(列名);

需求:我们在 T_owners 表的 ownertypeid 列上建立位图索引,语句:

create bitmap index index_owners_typeid
on T_OWNERS(ownertypeid);

什么时候创建索引

以下情况可以创建索引:

  • 列中数据值分布范围很广
  • 列经常在 WHERE 子句或连接条件中出现
  • 表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%

什么时候不要创建索引

下列情况不要创建索引:

  • 表很小
  • 列不经常作为连接条件或出现在WHERE子句中
  • 查询的数据大于2%到4%
  • 表经常更新

Desc emp;
Create index name_index on emp(name);

索引不需要用,只是说我们在用name进行查询的时候,速度会更快。当然查的速度快了,插入的速度就会慢。因为插入数据的同时,还需要维护一个索引。

查询索引

可以使用数据字典视图 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
oracle-索引_第3张图片

删除索引

使用DROP INDEX 命令删除索引

drop index name_index ;

只有索引的拥有者或拥有DROP ANY INDEX 权限的用户才可以删除索引
删除操作是不可回滚的

你可能感兴趣的:(oracle,oracle,数据库,database)