三、管理方案对象
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';

浙公网安备 33010602011771号