索引 INDEX
伪列
伪装起来的列,不容易被看见,要特意查询才能看见
ROWNUM:
是对查询结果自动生成的一组连续的自然数序号。
SELECT emp.*,ROWNUM FROM emp
例题:查询emp表中,前三个员工
SELECT * FROM * from emp where ROWNUM <=3;
查询第四到第六条数据
SELECT C.*, ROWNUM
FROM (SELECT B.*, ROWNUM D
FROM (SELECT EMP.*, ROWNUM A FROM EMP WHERE ROWNUM <= 6) B
ORDER BY A DESC) C
WHERE ROWNUM < 4;
查询工资前三名
SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM <= 3;
注意!
查询结果必须包含第一条数据
ROWID:
类似于身份证,每条数据在存入到数据库时,数据库会自动分配一组18位的不重复字符串。作用是记录每条数据的物理位置。
SELECT emp.*,ROWID FROM emp;
索引
索引:实际上是一个指针,指向表中的数据,可以提高查询效率,可以理解为目录。
索引会降低DML语句速度
Oracle会自动的使用和维护索引。
索引的分类
按照存储内容不同
B-TREE索引
存储的是(索引列原始数据+ROWID)
Oracle默认的索引类型,最常用的索引类型
创建B-TREE索引
CREATE INDEX 索引名 ON 表名(列名)
索引名尽量以ind 开头
注意:一个字段上不能创建多个索引但一个字段可以存在与多个索引中
B-TREE索引常用在列基数比较大的时候
列基数:不重复的数据
位图索引
存储的是(位图+ROWID)
是指在创建位图索引时,会扫描整张表,位索引列每个取值创建一个不重复的位图,根据位图描述该取值
使用场景:列基数比较小的时候
CREATE BITMAP INDEX 索引名 ON 表名(列名1.....)
反向建索引
存储的是(索引列原始数据反向存储+ROWID)
B-TREE索引的一种特殊形式,所有的数据反向存储
使用场景:当某个节点(叶)占比过高 比如(身高)
CREATE INDEX 索引名 On 表名(列名1.....) REVERSE
基于函数的索
存储的是(索引列原始数据经过函数处理+ROWID)
是B-TREE索引的一种特殊形式,创建索引是添加函数
使用场景:当经常查询某列,用函数查询,比如LENGTH(ename)
CREATE INDEX ind_aa ON emp(LENGTH(ename))
SELECT * FROM emp WHERE LENGTH(ename) = 5;
按照列的个数不同
单列索引
基于一个字段创建的索引
复合索引(联合索引)
基于多个字段创建的索引
如果是基于ABC三个字段创建的索引,在使用时必须遵循最左原则 如 WHERE条件后面必须是 WHERE A =…AND B=… AND C=…,不能换位置
如果写 WHRER A=… AND C=… 也可以 但是效率会折扣
不能写c a…
按照唯一性
唯一索引
索引列数据唯一
CREATE UNIQUE INDEX 索引名 ON 表名(列名)
注意:
1.位图索引不能创建唯一索引
2.主键约束或者唯一约束的列,会自动创建一个同名的唯一索引
非唯一索引
索引列数据可以重复
索引扫描
是指根据条件在对应的索引列,从大概位置开始检索,检索到最后一条符合条件的数据为止,然后将符合条件的数据的ROWID取出,根据ROWID取出整行数据
全盘扫描
是指按照条件在对应的条件列,从第一条开始检索,检索到最后一条为止,然后将符合条件的数据的ROWID取出,根据ROWID取出整行数据
ROWID扫描
是最快的
索引失效
索引不是越多越好
删除索引
drop index 索引名
修改索引
ALTER INDEX 索引名 RENAME TO 新索引名
禁用索引的方法
ALTER INDEX 索引名 UNUSABLE
解禁索引的语法
ALTER INDEX 索引名 REBUILD
查看用户下所有索引
SELECT INDEX_NAME FROM USER_INDEXES