[Oracle数据库学习]十二、其他数据库对象

D7

常见的数据库对象

对象 描述
基本的数据存储集合,由行和列组成
视图 从表中抽出的逻辑上相关的数据集合
序列 提供有规律的数值
索引 提高查询的效率
同义词 给对象起别名

 

序列

什么是序列

序列:
1)自动提供唯一的数值
2)共享对象
3)主要用于提供主键值
4)代替应用代码
5)将序列值装入内存可以提高访问效率

 

创建序列CREATE SEQUENCE

CREATE SEQUENCE sequence
    [INCREMENT BY n]
    [START WITH n]
    [{MAXVALUE n| NOMAXVALUE}]
    [{MINVALUE n| NOMINVALUE}]
    [{CYCLE | NOCYCLE}]
    [{CACHE n| NOCACHE}];

创建序列DEPT_DEPTID_SEQ为表DEPARTMENTS提供主键,不使用CYCLE选项

CREATE SEQUENCE dept_deptid_seq
  INCREMENT BY 10
  START WITH 120
  MAXVALUE 9999
  NOCACHE
  NOCYCLE;

 

查询序列

查询数据字典视图USER_SEQUENCES获取序列定义信息。

如果指定NOCACHE 选项,则列LAST_NUMBER显示序列中下一个有效的值。

SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;
SEQUENCE_NAMEMIN_VALUEMAX_VALUEINCREMENT_BYLAST_NUMBER
DEPT_DEPTID_SEQ 1 9999 10 120

 

NEXTVAL和CURRVAL伪列

1)NEXTVAL返回序列中下一个有效的值,任何用户都可以引用;
2)CURRVAL中存放序列的当前值;
3)NEXTVAL应在CURRVAL之前指定,二者应同时有效。

 

使用序列

1)使用序列生成主键department_id值。

INSERT INTO departments(department_id, department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

查询:

SELECT * FROM departments;
DEPARTMENT_IDDEPARTMENT_NAMELOCATION_ID
120 Support 2500

 

2)查看序列的当前值

SELECT dept_deptid_seq.CURRVAL
FROM dual;
CURRVAL
130

注:序列定义为120开始,间隔10。

 

将序列值装入内存可提高访问效率。


序列在下列情况下出现裂缝:
1)回滚
2)系统异常
3)多个表同时使用同一序列


如果不将序列的值装入内存(NOCACHE),可使用表USER_SEQUENCES查看序列当前的有效值。

 

修改序列ALTER SEQUENCE

修改序列的增量、最大值、最小值、循环选项或是否装入内存。

ALTER SEQUENCE dept_deptid_seq
    INCREMENT BY 20
    MAXVALUE 999999
    NOCACHE
    NOCYCLE;

 

修改序列时需要注意:

1)用户必须是序列的拥有者,或对序列有ALTER权限;
2)只有将来的序列值会被改变;
3)改变序列的初始值:只能通过删除序列之后重建序列的方法实现;
4)其它的一些限制。

 

删除序列DROP SEQUENCE

使用DROP SEQUENCE语句删除序列。
删除之后,序列不能再次被引用。

DROP SEQUENCE dept_deptid_seq;

 

索引

什么是索引

1)一种数据库对象
2)通过指针加速Oracle服务器的查询速度
3)通过快速定位数据的方法,减少磁盘I/O
4)索引与表相互独立
5)Oracle服务器自动使用和维护索引

 

创建索引

自动创建:在定义PRIMARY KEY或UNIQUE约束后系统自动在相应的列上创建唯一性索引;
手动创建:用户可以在其它列上创建非唯一的索引,以加速查询。

 

在一个或多个列上创建索引

CREATE INDEX index
ON table(column[, column]...);

示例:

CREATE INDEX emp_manager_id_idx
ON employees(manager_id);

 

错误示例:

CREATE INDEX emp_employee_name_idx
ON employees(employee_name);

结果:ORA-01408: such column list already indexed

 

什么时候创建索引

以下情况可以创建索引:
1)列中数据值分布范围很广
2)列中包含大量空值
3)列经常在WHERE子句或连接条件中出现
4)表经常被访问而且数据量很大,访问的数据大概占数据总量的2%到4%

 

什么时候不要创建索引

下列情况不要创建索引:
1)表很小
2)列不经常作为连接条件或出现在WHERE子句中
3)查询的数据大于2%到4%
4)表经常更新
5)加索引的列包含在表达式中

 

查询索引

可以使用数据字典视图USER_INDEXES和USER_IND_COLUMNS查看索引的信息。

SELECT ic.index_name, ic.column_name,ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMPLOYEES';
INDEX_NAMECOLUMN_NAMECOL_POSUNIQUENESS
EMP_EMPLOYEE_NAME_UK EMPLOYEE_NAME 1 UNIQUE
EMP_MANAGER_ID_IDX MANAGER_ID 1 NONUNIQUE

 

基于函数的索引

基于函数的索引是一个基于表达式的索引。
索引表达式:列、常量、SQL 函数和用户自定义的函数。

CREATE INDEX upper_dept_name_idx
ON departments(UPPER(department_name));

查询:(体现查询性能)

SELECT *
FROM departments
WHERE UPPER(department_name) = 'TRADE';
DEPARTMENT_IDDEPARTMENT_NAMELOCATION_ID
2 Trade 2

 

删除索引

使用DROP INDEX命令删除索引

语法:

DROP INDEX index_name;

示例:

DROP INDEX upper_dept_name_idx;

 

规则:

只有索引的拥有者或拥有DROP ANY INDEX权限的用户才可以删除索引。

 

同义词

使用同义词访问相同的对象:
1)方便访问其它用户的对象
2)缩短对象名字的长度

 

创建同义词

CREATE [PUBLIC] SYNONYM synonym
FOR object;

为视图创建同义词:

CREATE SYNONYM d_sum
FOR dept_sum_vu;

 

删除同义词

DROP SYNONYM d_sum;

 

总结:

本节介绍序列、索引、同义词:

1)序列:为什么使用序列;创建(CREATE SEQUENCE)、更新(ALTER SEQUENCE)、删除(DROP SEQUENCE)序列;查询序列定义和当前值(USER_SEQUENCES)等;

2)索引:为什么使用索引;创建(CREATE INDEX)、删除(DROP INDEX)索引;查询索引(USER_INDEXES和USER_IND_COLUMNS);

3)同义词:创建(CREATE SYNONYM)、删除(DROP SYNONYM)同义词。

 

posted @ 2020-07-17 10:44  workingdiary  阅读(232)  评论(0)    收藏  举报