索引

索引

什么是索引

  1. 索引是数据库对象之一,用于加快数据的检索。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量。
  2. 索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表
    扫描检索方式,从而提高检索效率。
  3. 索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;
  4. 索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响
  5. 索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
  6. oracle创建主键时会自动在该列上创建索引

索引的原理

  1. 若没有索引,搜索某个记录时(例如查找name=‘scott’)需要搜索所有的记录,因为不能保证只有一个scott,必须全部搜索一遍
  2. 所在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值按照升序排列,然后后加索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方
  3. 创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用圈闭扫扫描速度已经很快,没必要使用索引

索引的类型

  1. 唯一和非唯一的索引:唯一索引是基于唯一列的索引。当使用了唯一约束时,由oracle自动创建
  2. 主索引和次索引:主索引是表的唯一索引,他是非空且唯一的。次索引是表中其他列上的索引,不是唯一索引。
  3. 组合索引:是包含了表中的两个列或者更多列,还成为拼接索引。

在这里插入图片描述

索引里的内容

列的值+rowid
select ename , rowid from emp;

create table test_emp
as select * from emp;

select ename , rowid from test_emp;

rowid是伪列,oracle专用的虚拟列,每个表的每一行都有rowid。
每一行的rowid是全局唯一的。(相当于行的身份证号)
例如:AAAR+RAAHAAAACTAAH 7788 SCOTT
rowid 18位, 64进制
包括:所在表的对象号 数据文件号 块号 块行号6363
6位对象号,3位文件号,6位块号,3位行号

B-tree索引

分类:UNIQUE,NON-UNIQUE(默认),REVERSE KEY
craete index ind_obj_id on test_object(‘object_id’);
适合使用场景:列基数(列不重复值的个数)大时适合使用B数索引

• user_indexes 查看索引名字、类型、表名、是否唯⼀索引
• user_ind_columns 查看索引名、表名、列名

col index_name for a20
col table_name for a10
col column_name for a20

select ic.index_name,ic.table_name,ic.column_name,ix.uniqueness
from user_indexes ix,user_ind_columns ic
where ic.index_name = ix.index_name
and ic.table_name = ‘EMP’;

查看执行计划

explain plan for select * from emp where
lower(ename)=‘scott’;
@?/rdbms/admin/utlxplp.sql

创建索引

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单列索引和复合索引

即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

create index ind_no_name on emp(empno, ename);

查看索引

查看表上具有哪些索引:
select index_name,index_type, tablespace_name, uniqueness
from all_indexes
where table_name =‘TABLE_NAME’;

重建/维护索引

索引的数据是跟着基表的DML活动而经常发生变化的。
基表删除数据后,对应的索引叶节点中空间不会被释放、不会被重用。
在DML操作十分频繁的表上的索引,有可能会变得非常庞大。
方式1:删除原来的索引,重新建立索引. drop index ; create index
方式2:
ALTER INDEX ind_obj_id REBUILD ;
ALTER INDEX ind_obj_id REBUILD ONLINE;
ALTER INDEX ind_obj_id REBUILD ONLINE NOLOGGING;
方式3: 合并索引(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,不需额外存储空间,代价较低)
alter index index_sno coalesce;

索引重命名
ALTER INDEX old_name RENAME TO new_name ;
表重命名
ALTER TABLE old_name RENAME TO new_name ;

监控索引

• 监控索引的有效性。可请求Oracle对索引进行监控。
索引的拥有者执行以下命令:
ALTER INDEX ind_obj_id MONITORING USAGE;
— 终⽌监控活动:
ALTER INDEX ind_obj_id NOMONITORING USAGE;
SELECT * FROM V$OBJECT_USAGE WHERE INDEX_NAME = ‘IND_OBJ_ID’;
INDEX_NAME TABLE_NAME MON USE


IND_O TEST_OBJECT YES NO

在这里插入图片描述

收集统计信息

在这里插入图片描述
合并索引 (表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无须额外存储空间,代价较低)
alter index index——sno coalesce;

删除索引
drop index index_sno;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值