今天我们来一起学习一下如何在Orcale数据库中管理数据库对象
一.同义词
1.方案
方案是数据库对象的集合,方案中包含各种对象(表、视图、索引、同义词、序列、数据库连接等)。
一般情况下,一个用户对应一个方案,当然,用户还可以有其他方案。
2.同义词
同义词是方案对象的别名,常用与简化对象和提高对象访问的安全性,它不占用实际存储空间
2.1公用同义词
公用同义词是由一个特殊的用户组PUBLIC所拥有,数据库中额所有用户都可以使用公用同义词
语法:CREATE [OR REPLACE] PUBLICE SYNONYM synonym_name [schema.]object
注:如果使用用户对公用同义词引用的对象无权限,则他不能使用该同义词
--授权
grant create public synonym to scott;
--为dept表创建公用同义词
create or replace public synonym pubsyn_dept for dept;
2.2方案同义词
方案同义词由创建它的用户所拥有,该用户可以控制其他用户是否有权使用属于自己的方案同义词
语法:CREATE [OR REPLACE] SYNONYM sysnonym_name [schema.]object
--授权
grant create synonym to scott;
--为dept表创建方案同义词
create or replace synonym syn_dept for dept;
2.3删除方案同义词
语法:DROP SYNONYM synonym_name
2.4删除公用同义词
语法:DROP PUBLIC SYNONYM synonym_name
3.序列
序列(SEQUENCE)是一个命名的顺序编号生成器,它能以串行的方式生成一系列顺序整数
用途:主键、外键值应用需求,流水号应用需求,序列的生成与定义的内容
语法:CREATE SEQUENCE sequnce_name
[START WITH n1] --指定要生成的第一个序列号
[INCREMENT BY n2] --指定序列号之间的间隔,默认为1,n2为正,序列递增,反之,序列递减
[{MAXVALUE n3 | NOMAXVALUE}] --序列可生成的最大值或我最大值
[{MINVALUE n4 | NOMINVALUE}] --序列可生成的最小值或无最小值
[{CACHE n5 | NOCACHE}] --指定在高速缓存中可预分配序列号的个数,默认为20
[{CYCLE | NOCYCLE}] --指定在达到序列最大值或最小值后是否循环
[ORDER]; --指定按顺序生成序列号
3.1创建序列
--授权
grant create sequence to scott
--创建序列seq_id
create sequence seq_id
start with 300
increment by 1
maxvalue 99999999
cache 10
nocycle;
3.2使用序列
在应用序列currval列之前,必须引用过一次nextval列,用于初始化序列的值
select seq_id.nextval from dual;
--结果为300
select seq_id.currval from dual;
--结果为300
3.3更改序列
语法:ALTER SEQUENCE sequence_name
[INCREMENT BY n2]
[{MAXVALUE n3 | NOMAXVALUE}]
[{MINVALUE n4 | NOMINVALUE}]
[{CACHE n5 | NOCACHE}]
[{CYCLE | NOCYCLE}]
3.4删除序列
语法:DROP SEQUENCE sequence_name
4.视图
视图(VIEW)是有SELECT子查询语句定义的逻辑表,它只有定义、没有数据,是一个"虚拟表"。
4.1创建视图
语法:CREATE [OR REPLACE] [FORCE] VIEW view_name --FORCE强制创建(无论基表是否存在都创建)
[(alias1,alias2...)] --指定由视图的查询所选择的表达式或列的别名
AS select_statement --创建视图时的select语句
[WITH CHECK OPTION [CONSTRAINT constraint]] --在使用视图时,检查涉及的数据是否通过select子查询的where条件
[WITH READ ONLY]; --创建的视图只能用于查询,而不能用于更改数据,不能与order by子句同时存在
--授权
grant create view to scott;
--创建视图v_scoot_1
create view v_scott_1 as
select empno,ename,job from emp where deptno=20;
--创建视图v_scott_2
create view v_scott_2(工号,姓名,职位) as
select empno,ename,job from emp where deptno=20;
4.2在视图上执行DML操作
在视图上进行的所有DML操作都会在基表的数据上完成
4.2.1可以用户更新的连接视图:
(1)不包含集中运算符(union、union all、intersect、minus等)
(2)不包含distinct关键字
(3)不包含group by、order by、connect by或start with子句
(4)不包含子查询
(5)不包含分组函数
(6)需要更新的列不是由列表达式定义的
(7)表中所有的not null列均属于该视图
4.2.2键值保存表
如果连接视图中的一个基础表的主键(主键、唯一键)在它的视图中任然存在,则该基础表称为键值保存表
4.3查询视图信息
4.3.1查询视图可更新的列
使用USER_UPDATABLE_COLUMNS数据字典可以查询当前用户方案中所有的表以及视图所有可修改的列
--查询v_dept_emp_视图中所有可更新的列select a.column_name,a.updatable,a.insertable,a.deletable
from user_updatable_columns a
where a.table_name=upper('v_dept_emp_1');
4.3.2查询视图定义信息
使用USER_VIEWS数据字典可以查询当前方案中视图的定义信息
--查询v_dept_emp_1视图的定义信息
select c.view_name,c.text from user_views c
where
c.view_name=upper('v_dept_emp_1');
4.4删除视图
语法:DROP VIEW view_name
4.索引
4.1索引概述
索引是一种与表相关的可选的方案对象
4.2创建索引
语法:CREATE INDEX index_name on table_name (column list)[TABLESPACE tablespace_name]
index_name:创建索引的名
table_name:创建索引的表名
column_list:指定在表上创建索引的列名列表,可以基于多列创建索引
tablespace_name:为索引指定表空间
--授权
grant create index to scott;
--为scott方案中的emp表创建基于sal的索引
create index idx_emp on emp(sal)
4.3索引的分类
(1).单列索引与复合索引
基于一列创建的索引为单列索引,基于二列或二列以上的为复合索引
(2).唯一索引与非唯一索引
唯一索引所基于的列不能有重复值,非唯一索引基于的列可以有重复值,可以为null
(3).标准(B树)索引
B树索引按B树结构组织并存放索引数据
(4).位图索引
对于基数(指某个列可能拥有的不重复值的个数)很小的列,为了加快查询效率,应该在这些列上创建位图索引
(5).函数索引
对包含有列的函数或表达式创建的索引被称为"函数索引"
4.4创建各类索引
(1)唯一索引
--在emp表的ename列创建一个唯一索引idx_emo_ename
create unique index idx_emp_ename on emp(ename);
(2)复合索引
--在emp表中的ename和job列创建复合索引
create index idx_emp_ename_job on emp(ename,job);
(3).位图索引
--在emp表的job列上创建位图索引
create bitmap index idx_bm_emp_job on emp(job);
(4).函数索引
create index indx_fun_emp_hiredate on emp(extract(year from hiredate));
4.5合并索引
--合并索引indx_fun_emp_hiredate
alter index indx_fun_emp_hiredate coalesce;
4.6重建索引
--重建索引indx_fun_emp_hiredate
alter index indx_fun_emp_hiredate rebuild;
4.7监视索引的使用情况
在v$object_usage数据字典动态性能视图中记录索引的使用情况
步骤:(1)使索引处于被监视状态
--使索引idx_emp_ename_job处于监视状态
alter index idx_emp_ename_job monitoring usage;
(2)执行SQL语句,查看被监视索引的使用情况
4.8查看索引信息
可以使用user_indexes数据字典视图查看一个表中所有的索引信息
INDEX_NAME:索引名
INDEX_TYPE:索引类型(FUNCTION-BASED NORMAL:B树索引,BITMAP:位图索引,NORMAL:普通的B树索引)
UNIQUENES:该列是否是唯一索引
4.9创建索引的原则
(1)一般不需要为数据量很小的表创建索引
(2)对于数据量比较大,每次查询量小于所有数据的15%的可以考虑为该表创建索引
(3)应该为大部分列值不重复的列创建索引
(4)对于取值范围较大的类,应创建B树索引
(5)对于包含多个null值,但经常需要查询所有非null值记录的列,应该创建索引
(6)不能为CLOB或BLOB等大对象数据类型的列上创建索引
(7)对于经常需要进行连接查询的多个表而言,在用于连接的列上创建索引能够显著提高查询的速度
(8)Orcale会自动得为具有PRIMARY KEY约束和UNIQUE约束的列上创建索引
(9)虽然一张表可以拥有任意数目的索引,但表中索引越多,维护索引所需的开销就越大