三、管理方案对象

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';

  

 

posted @ 2018-08-29 09:40  Reid21  阅读(180)  评论(0编辑  收藏  举报