Oracle笔记16——Oracle序列、索引与同义词

一、

索引(INDEX):单列索引、复合索引,用于优化查询效率
自动创建:当创建PRIMARY KEY或UNIQUE 约束时,默认创建索引
手动创建CREATE INDEX idx_tableName_columName ON 表名(列名1[,列名2...])

ROWNUM 伪列
虚拟存在的,每查询一次数据,永远从1开始,只能使用 <或者 <=比较

SELECT ROWNUM,e.* FROM emp e;

 

二、ROWID 伪列

真实存在在物理磁盘中,唯一标识每一行数据的值

 

----------------------
--创建索引
----------------------
--单列索引
1.在emp表的ename字段上创建索引.
CREATE INDEX idx_emp_ename ON emp(ename);

--复合索引(组合索引)
2.在emp表的deptno和job的组合上创建索引
CREATE INDEX idx_emp_deptno_job ON emp(deptno,job);

--测试索引
1.创建表emp_bak表,表结构同emp(即复制emp的表结构)
CREATE TABLE emp_bak AS SELECT * FROM emp;
2.往emp_bak表中插入大批量数据(单位:百万)
INSERT INTO emp_bak SELECT * FROM emp_bak;--多次执行,1835008条数据
3.将empno设置为唯一值
--将empno的长度修改为7
ALTER TABLE emp_bak MODIFY (empno NUMBER(7));--1.将empno的长度修改为7
UPDATE emp_bak SET empno = ROWNUM;--2.使用ROWNUM将empno修改为唯一值
UPDATE emp_bak SET empno = seq_emp.nextval;--2.也可以使用nextval将empno修改为唯一值

SELECT * FROM emp_bak;

4.查询empno为1835008的员工信息
SELECT * FROM emp_bak WHERE empno = 1835008;--无索引  大约查询时间为0.20s

CREATE INDEX idx_emp_empno ON emp_bak(empno);--创建索引

SELECT * FROM emp_bak WHERE empno = 1835008;--有索引  大约查询时间为0.01s

 

三、分析有无索引的区别

----------分析有无索引的区别------------start
--1.无索引
DROP INDEX idx_emp_empno;
SELECT ROWID,emp_bak.* FROM emp_bak WHERE empno = 1835008;--0.2  干巴巴的查询了4700多行,才找到该数据

--2.有索引:给empno创建了一个索引,为了维护 1835008 -> AAAR7fAAEAAACwyACq 这段奇妙的关系,需要花代价1835008 -> AAATBlAAEAAAOMfABa 
SELECT ROWID,empno FROM emp_bak WHERE empno = 1835008;--AAAR7fAAEAAACwyACq
AAAR7fAAEAAAACzAAA  1
AAAR7fAAEAAAACzAAB  2
AAAR7fAAEAAAACzAAC  3
AAAR7fAAEAAAACzAAD  4
AAAR7fAAEAAAACzAAE  5
AAAR7fAAEAAAACzAAF  6
AAAR7fAAEAAAACzAAG  7
.....................
AAAR7fAAEAAACwyACq  1835008
②AAATBlAAEAAAOMfABa -> 1835008对应的数据
SELECT ROWID,emp_bak.* FROM emp_bak WHERE ROWID = 'AAAR7fAAEAAACwyACq';--0.01 查询了1行
----------分析有无索引的区别------------end

---------------
--删除索引
-----------------
DROP INDEX idx_emp_empno;

 

 

四、数据字典表

SELECT * FROM user_tables;--查询当前用户下所有的表格
SELECT * FROM user_constraints;--查看当前用户下所有的约束
SELECT * FROM user_cons_columns;--查看约束关联的列信息
SELECT * FROM user_indexes;--查询当前用户下所有的索引
SELECT * FROM user_ind_columns;--查看索引关联的列信息

 

五、

序列(sequence):按照一定的规则自动增长或自动减少,通常用于生成主键值

--简单创建
CREATE SEQUENCE seq_emp;

--复杂创建
CREATE SEQUENCE seq_emp
MINVALUE 1             --最小值
MAXVALUE 9999999999999999999999999999     --最大值 maxvalue n| nomaxvalue 没有最大值
START WITH 1                              --开始值
INCREMENT BY 1                            --原增的值
NOCYCLE                                   --默认不循环,cycle | nocycle
CACHE 20;                                 --默认缓存20


CREATE SEQUENCE seq_dept
MINVALUE 10
MAXVALUE 90
START WITH 10
INCREMENT BY 10
NOCYCLE
NOCACHE;

--两个属性
--   nextval : 获取序列的下一个值
--   currval :获取同一个会话中,序列的当前的值,且取值之前必须先执行nextval取下一个值
SELECT seq_emp.nextval FROM dual;
SELECT seq_emp.currval FROM dual;

--使用序列:新增数据时,自动生成主键值
INSERT INTO emp(empno, ename, job) VALUES(seq_emp.nextval, '张三', 'SALSMAN');
SELECT * FROM emp;

--修改序列:除了START WITH以外的属性均可以修改
1.将seq_dept的最大值修改为200
ALTER SEQUENCE seq_dept
MAXVALUE 200

--删除序列
DROP SEQUENCE seq_emp;

 

六、

创建同义词(SYSNONYM):给对象取别名
创建同义词的语法如下:
CREATE [PUBLIC] SYNONYM 同义词 FOR 表名;

1.为表emp创建私有同义词e
CREATE SYNONYM e FOR emp;
SELECT * FROM e;--这时通过同义词e便可以访问表emp了
--其它用户可以通过以下方式访问scott的e
SELECT * FROM scott.e;

2.为dept表创建共有同义词d
CREATE PUBLIC SYNONYM d FOR dept;
--其它用户可以直接访问e
SELECT * FROM d;

3.删除同义词
DROP SYNONYM e;
DROP PUBLIC SYNONYM d;

 

posted @ 2021-11-11 19:47  `青红造了个白`  阅读(118)  评论(0编辑  收藏  举报