三、管理方案对象
1. 方案
描述:属于一个用户下,所有数据库对象的总体,表、视图、序列、索引、同义词、存储过程、存储函数、触发器、包和包体等
方案与用户关系:一个用户就是一个方案,创建用户的时候,系统会自动创建一个同名的方案
2. 临时表
创建:自动创建,使用order by,一张普通表在使用order by后,会创建一个排好序后的临时表,看到的结果也是临时表的结果
手动创建,create global temporary table ...
作用:当事务或会话结束时,表中的数据会自动删除
基于事务的临时表
SQL> create global temporary table test1 2 (tid number,tname varchar2(20)) 3 on commit delete rows; Table created. SQL> insert into test1 values(1,'Tom'); 1 row created. SQL> insert into test1 values(2,'Mary'); SQL> select * from test1; TID TNAME ---------- -------------------- 1 Tom 2 Mary SQL> commit; 事务提交后会保存下来,但是test1是一张临时的表,一旦事务结束就会没了 SQL> select * from test1; no rows selected
基于会话的临时表
preserve: 保留,提交后还会保留行,只有会话退出表的数据才没 SQL> create global temporary table test2 2 (tid number,tname varchar2(20)) 3 on commit preserve rows; Table created. SQL> insert into test2 values(1,'Tom'); 1 row created. SQL> insert into test2 values(2,'Mary'); 1 row created. SQL> commit; Commit complete. SQL> select * from test2; TID TNAME ---------- -------------------- 1 Tom 2 Mary SQL> exit SQL> select * from test2; no rows selected
3. 约束和约束的状态
(1)、enable disable 是否允许约束或不允许
(2)、validate 对表中已经存在的数据和将来的数据都要进行验证
novalidate 对表中已经存在的数据不做验证,只验证将来的数据
实例:
create table test3 ( tid number, tname varchar2(20), email varchar2(40) ); insert into test3 values(1,'Tom','tom@123.com'); #邮件地址应该不一样的 insert into test3 values(2,'Mary','tom@123.com'); 在email上加上unique约束,deferrabel是延时校验,如在已经有问题的数据中使用Novalidate会有报错,所以要使用deferrable alter table test3 add constraint test3_email_unique unique(email) deferrable enable novalidate; insert into test3 values(3,'Ma','tom@123.com'); ERROR at line 1: ORA-00001: unique constraint (SCOTT.TEST3_EMAIL_UNIQUE) violated
4. 分区
俗话描述:如对一张emp的员工表进行查询,select * from emp where sal > 3000,如果是基本的操作会把全表进行扫描,这样会影响查询的效率的,可以对表进行分区,如分三个区1000-2000个区,2000-3000一个区,3000-6000一个区,这样查询时,就直接在第一、二两个分区上进行扫描以提升效率
分析类型
基本分区
- 范围分区
create table test4 ( empno number, ename varchar2(20), sal number, deptno number ) partition by range(sal) ( partition part_range_1 values less than (1000), partition part_range_2 values less than (3000), partition part_range_3 values less than (MAXVALUES) );
插入数据就会按照范围来划分
insert into test4 select empno,ename,sal,deptno from emp; commit;
查询SQL的执行计划
explain plan for select * from test4 where sal<=2500; select * from table(dbms_xplan.display); #会有PARTITION RANGE 的操作
- 列表分区:按照某个值在那个列表中分区
描述:如把部门号的值做来分区,如10,20号部门在第一分区,30,40号部门在第二个分区,当要查某个部门号时就直接去相应的分区查询
create table test5 ( empno number, ename varchar2(20), sal number, deptno number ) partition by range(deptno) ( partition part_list_1 values (10,20), partition part_list_2 values (30), partition part_list_3 values (40,50) );
- Hash分区: 某个列得到的hash值就分配到同一分区(最简单算法是除余数)
create table test6 ( empno number, ename varchar2(20), sal number, deptno number ) partition by hash(ename) ( partition part_hash_1, partition part_hash_2 );
组合分区
- 范围-列表分区
- 范围-hash分区
5. 数据字典
数据字典的命名规则
- USER 用户自己创建的
- DBA 管理员视图
- ALL 用户可以访问的
- V$ 动态性能视图
SQL> select * from tab; #实际是一张表,包含所有表的信息,有数据库的元信息 TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE TEST1 TABLE TEST2 TABLE TEST3 TABLE
--获取SCOTT用户能够访问的数据字典
select * from dictionary; TABLE_NAME(数据字典名称) COMMENTS(说明) USER_CONS_COLUMNS Information about accessible columns in constraint definitions
--获取当前用户创建的表
select * from user_tables;
常用的数据字典
- DICTIONARY
- 数据库对象:USER_OBJECTS和ALL_OBJECTS
- 表: USER_TABLES和ALL_TABLES
- 约束:USER_CONSTRAINTS
- 视图:USER_VIEWS和ALL_VIEWS
- 序列:USER_SEQUENCES
给表加注释
- 使用comment语句给表或才加注释
comment on table emp is 'This is the employees information'; select * from user_tab_comments where table_name='EMP';