章节目标
- 通过本章学习,学员应达到如下目标:
- 理解序列、索引对象的作用及概念;
- 掌握序列的创建及使用方法;
- 掌握索引的创建及使用方法;
- 掌握何时应该创建索引;
- 了解同义词的概念;
本章内容
序列的概念
- 序列(SEQUENCE)
- 序列是按照一定规则能自动增加/减少数字的一种数据库对象。
- 通常可以使用序列自动地生成主键值。
创建序列
- 语法:
CREATE SEQUENCE [schema.] sequencename
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
sequencename:序列对象的名字
INCREMENT BY n:序列连续两个值之间的间隔n,默认为1。
START WITH n :序列起始值n,该项省略,起始值为1
MAXVALUE n :序列最大值;NOMAXVALUE :指定序列无最大值
MINVALUE n :序列最小值;NOMINVALUE :指定序列无最小值
CYCLE|NOCYCLE:表示序列在达到最大值或最小值之后是否继续产生序列值,NOCYLE表示不再产生,NOCYLE是默认选项。
CACHE n|NOCACHE:表示序列值被服务器预先分配并存储在内存中,NOCACHE表示不预先分配并存储,CACHE 20是默认选项
例:创建序列test_seq,起始值为10,每次增长2,最大值100,最小值9,循环序列,每次缓存10
CREATE SEQUENCE test_seq
START WITH 10 --序列从10开始
INCREMENT BY 2 --序列每次增加2
MAXVALUE 100 --序列最大值100
MINVALUE 9 --序列最小值9
CYCLE --序列循环,每次增加2,一直到100后回到9从新开始
CACHE 10; --缓存中序列值个数为10
序列属性
- NEXTVAL和CURRVAL伪列
- CURRVAL:表示序列返回的当前值;
- NEXTVAL:表示序列返回的下一个值;
- CURRVAL在被引用之前,必须先使用NEXTVAL来产生一个序列值;
- 可用语句 序列名.CURRVAL或 序列名.NEXTVAL来访问序列;
- NEXTVAL和CURRVAL伪列
- 您可以在下列情况使用NEXTVAL 和 CURRVAL:
- SELECT 语句的SELECT列表中,但不包括子查询中的SELECT语句
- INSERT 语句中的子查询SELECT列表中
- INSERT 语句的VALUES子句中
- UPDATE 语句的SET子句中
- 下列情况不能使用 NEXTVAL 和 CURRVAL:
- 在视图的SELECT列表中
- 包含DISTINCT关键字的 SELECT语句中
- 含有 GROUP BY, HAVING, ORDER BY子句的SELECT语句中
- SELECT, DELETE, UPDATE 语句的子查询中
- 含有 DEFAULT表达式的 CREATE TABLE、 ALTER TABLE 语句中
- 您可以在下列情况使用NEXTVAL 和 CURRVAL:
使用序列
- 序列的使用
- 创建序列student_seq:
CREATE SEQUENCE student_seq
START WITH 10000
INCREMENT BY 1;
- 使用序列student_seq生成student表中sid列插入值:
INSERT INTO student
VALUES (student_seq.NEXTVAL, 'Scott', 'Computer Science', 11);
- 查看student_seq序列当前值:
SELECT student_seq.CURRVAL FROM dual;
修序序列
- 修改序列的语法如下:
ALTER SEQUENCE [schema.]sequencename
[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
修改序列的语法没有START WITH子句。
-
修改序列
- 正确修改
ALTER SEQUENCE test_seq
INCREMENT BY 4 ——序列每次增加4
MAXVALUE 1000 ——序列最大值1000
NOCACHE; ——不设定缓存
- 错误修改
ALTER SEQUENCE test_seq
INCREMENT BY 4
MAXVALUE 100 ——最大值100小于已经分配的序列值200
NOCACHE;
删除序列
- 删除序列的语法如下:
DROP SEQUENCE [schema.]sequencename;
- 例:删除序列student_seq
DROP SEQUENCE student_seq;
ROWID
- ROWID
- 是一个伪列,系统自动产生。
- ROWID能唯一标示每一条数据库行记录的物理地址,通过 ROWID 能快速定位到一条行记录。
SELECT rowid,ename
FROM emp;
ROWID | ENAME |
---|---|
AAAMfPAAEAAAAAgAAA | SMITH |
AAAMfPAAEAAAAAgAAB | ALLEN |
- ROWID的格式
例: AAAHjXAAOAAAADaAAA
数据对象编号 文件编号 块编号 行编号
AAAHjX AAO AAAADa AAA
ROWID | ENAME |
---|---|
AAAHjXAAOAAAADaAAA | SMITH |
AAAHjXAAOAAAADaAAC | ALLEN |
- ROWID的应用
- 快速定位记录,使用ROWID检索及操作数据,效率最快
例:使用ROWID修改数据
UPDATE emp
SET ename = ename || '*'
WHERE ROWID = 'AAAMg6AAFAAAABUAAA';
索引概念
- 索引( INDEX ):
- 是对数据库表中一个或多个列的值进行排序的一种数据库对象。
- 在数据库中,通过索引可以加速对表的查询速度;
索引类别
- 单列索引:
- 索引建立在表中的某一列上
- 复合索引:
- 索引建立在表中某几列的组合上
创建索引
-
两种方式:
- 自动创建: 当有 PRIMARY KEY 或者 UNIQUE 约束时,数据库会自动创建一个索引;
- 手动创建: 用户使用创建索引语法来进行创建;
- 创建索引语法:
CREATE INDEX indexname
ON table (column[, column]...);
建议索引命名格式:idx_tablename_columnname
例:在emp表的ename字段上创建索引.
CREATE INDEX idx_emp_ename
ON emp (ename);
- 例:在emp表的deptno和job的组合上创建索引
CREATE INDEX idx_emp_deptnojob
ON emp (deptno,job);
测试索引
- 创建测试环境表
CREATE TABLE e1 AS SELECT * FROM emp;
INSERT INTO e1 SELECT * FROM e1;--多次运行
UPDATE e1 SET empno=ROWNUM; --更新所有记录的empno,
--以使其数值唯一
commit;--提交
- 测试无索引检索时间。
SELECT ename,sal FROM e1
WHERE empno=210000;
- 测试建索引后检索时间。
CREATE INDEX e1_id ON e1(empno); --创建索引
SELECT ename,sal FROM e1
WHERE empno=210000; --再次在有索引的情况下做测试
适合创建索引情况
- 表数据量很大
- 要查询的结果集在2%-4%左右
- 经常用来做WHERE条件中的列或者多表连接的列
- 查询列的数据范围分布很广
- 查询列中包含大量的NULL值,因为空值不包含在索引中
不适合创建索引情况
- 数据量很小的表
- 在查询中不常用来作为查询条件的列
- 频繁更新的表
- 索引列作为表达式的一部分被使用时,比如常查询的条件是SALARY*12,此时在SALARY列上创建索引是没有效果的
- 查询条件中有单行函数时,用不上索引
索引缺点
- 占用空间;
- 降低DML的操作速度;
删除索引
- 删除索引的语法
DROP INDEX index;
- 删除索引后,索引中的数据及定义被删除,索引所占的数据空间被释放,但表中的数据仍然存在。
相关数据字典
- USER_INDEXES 数据字典视图包含索引的名称及其唯一性;
- USER_IND_COLUMNS数据字典视图包含索引名称、表名以及列名;
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = 'EMP';
同义词
- 同义词的概念
-
同义词( SYNONYM )
- 是指向数据库对象(如:表、视图、序列、存储过程等)的数据库指针。
-
使用同义词好处:
- 可以简化对数据库对象的访问;
- 方便对其他用户表的访问;
- 简化过长的对象名称;
- 节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
- 扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
- 同义词可以创建在不同一个数据库服务器上,通过网络实现连接;
-
- 创建同义词
- 创建同义词的语法如下:
CREATE [PUBLIC] SYNONYM 同义词
FOR [schema.]对象名;
-
同义词两种类型:
- 私有(PRIVATE)。是在指定的方案中创建的,并且只允许拥有它的方案访问
- 公有(PUBLIC)。由PUBLIC方案所拥有,所有的数据库方案都可以引用他们。
-
删除同义词
- 创建employees表的别名。
CREATE SYNONYM s_emp
FOR hr.employees;
- 删除同义词。
DROP SYNONYM s_emp;
- 只有数据库管理员才拥有公有同义词的创建和删除权限。
本章重点总结
- 理解序列、索引对象的作用及概念;
- 掌握序列的创建及使用方法;
- 掌握索引的创建及使用方法;
- 掌握何时应该创建索引;
- 了解同义词的概念;
分割线
博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。