Oracle-内部存储机制(概念)

事务

数据库的事务:处理数据的最小的功能模块

begin
  执行语句;
end;

事务四个特性

原子性

独立的最小的功能模块

一致性

一个模块中所有的事务应该同时成功或者失败

隔离性

模块和事务之间不会互相影响都是完成各自的功能

持久性

数据应该是永久保存的

锁:一个人在操作某个数据的时候,另一个人不能对这个数据同时进行操作

分类

按修改的范围分类

行锁

A用户update或者delete某行数据的时候,B用户不能再去对这行数据做任何的更新

表锁

A用户update或者delete或者insert某行数据的时候,B用户不能去对这个表的结构做修改的

按上锁的主动性来分类

乐观锁

默认的日常操作就是乐观锁

悲观锁

不做DML操作,但是也要先对数据上锁

select * from emp where empno=7369 for update;

死锁

什么是死锁:多个不同的进程,在执行过程中,互相拥有和占用了对方的资源,谁都无法先释放出来

释放锁的操作:

v$locked_object 存储所有当前数据库的锁的数据

v$session 存储的登录用户的数据

--1.在表v$locked_object中查询是否存在锁,如果存在锁,查出其对应的对象id object_id 和序列id session_id
select * from v$locked_object; --object_id=74609,session_id=9

--2.根据锁的对象id object_id 在表dba_objects中查询锁的具体信息,可以看到锁住的表名
select * from dba_objects where object_id=74609;

--3.根据锁的序列id session_id 在表v$session中查询上锁用户的登录序列号serial#
select * from v$session where sid=9; --serial#=2065

--4.根据 session_id,serial# 删除对应的锁信息
alter system kill session '9,2065';

表分区

表分区:设置不同的规则,将相同规则的数据存放在一起,目的是节省数据检索的时间

有分区内容的表叫做分区表。

2000W以上数据的表格,就设置分区。

分区表创建

--基本格式
create table 表名字(
    列名 数据类型 约束条件
)partition by 分区类型(列名)
(
 分区的规则
);

范围分区

数值相关的列,时间相关的列 range

--基本格式:
create table 表名(
列名,数据类型,约束条件
...
)partition by range(列名)
(
partition 分区名 values less than(数值),
    ...
partition 分区名 vlaues less than(maxvalue)--其他
);
create table emp_range(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by range(sal)
(
    partition sal01 values less than(2000),
    partition sal02 values less than(3000),
    partition sal03 values less than(maxvalue)
);

列表分区

有大量重复值的固定信息的列 list

--基本格式
create table 表名(
列名,数据类型,约束条件
...
)partition by list(列名)
(
partition 分区名 values(值),
    ...
);
create table emp_list(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by list(deptno)
(
    partition d10 values(10),
    partition d20 values(20),
    partition d30 values(30) 
);

散列分区

没有任何规律的数据 hash 根据数据库里面的一个内置的哈希算法,进行数据的随机划分

--基本格式
create table 表名(
列名,数据类型,约束条件
...
)partition by hash(列名) partitions 分区数量;
create table emp_hash(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by hash(ename) partitions 4;

组合分区

用上面三种方法任意组合,将数据划分的更加细致

--基本格式
create table 表名(
列名,数据类型,约束条件
...
)partition by hash(列名) 
subpartition by range(列名)
(
partition 主分区名 values()
    (
    subpartition 副分区名 values less than(数值),
        ...
    ),
  ...
)
create table emp_complex(
empno number,
ename varchar2(30),
job varchar2(30),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by list(deptno)  --父分区
subpartition by range(sal)  --子分区
(
  partition dept10 values(10)
  (
    subpartition sal2000_10 values less than(2000),
    subpartition sal3000_10 values less than(3000),
    subpartition salmax_10 values less than(maxvalue)
  ),
  partition dept20 values(20)
  (
    subpartition sal2000_20 values less than(2000),
    subpartition sal3000_20 values less than(3000),
    subpartition salmax_20 values less than(maxvalue)
  ),
  partition dept30 values(30)
  (
    subpartition sal2000_30 values less than(2000),
    subpartition sal3000_30 values less than(3000),
    subpartition salmax_30 values less than(maxvalue)
  )
);

查看分区的信息

select * from user_tab_partitions;

添加新分区

alter table 表名 add partition 分区名 values 分区添加规则;

alter table emp_list add partition d40 values(40);

alter table sale_info add partition time20200918 values less than(date'2020-09-19');

合并分区

合并分区只能合并两个相邻的分区

--合并多个分区:分区的小的值和大的值要按顺序排列
alter table 表名 merge partitions 分区名1,分区名2...  into partition 新的分区名;
alter table sale_info merge partitions TIME20200917,TIME20200918
into partition month09;

重命名分区

alter table 表名 rename partition 分区名 to  新分区名;

alter table sale_info rename partition MONTH09_2 to MONTH09;

拆分分区

alter table 表名 split parition 分区名 at(date'2020-09-16')

into (partition time20200916, partition time202009);
alter table sale_info split partition TIME202009

at(date'2020-09-17')

into(partition time20200917, partition time20200918);

删除分区

不能把所有的分区都删除,至少留下一个

alter table 表名 drop partition 分区名;

alter table sale_info drop partition TIME20200918;

同义词

创建同义词

create public synonym 同义词 for 另一个表表名;

create public synonym sal for scott.salgrade;

删除同义词

drop public synonym 同义词;

drop public synonym sal;

序列

自动生成一组从大到小或者从小到大的一组数字 sequence

create sequence 序列名;

查看当前序列的内容:  序列名.currval
使用序列的下一个值:  序列名.nextval

作用

一般是当成某个表的主键id使用的,每个大表都会有属于自己的序列名字。

序列的属性

create  sequence 序列名
start with 开始数字
increment by 增长数
maxvalue 最大值   |    nomaxvalue
minvalue 最小值    |    nominvalue
cycle  |   nocycle
cache  缓存数量    |  nocache;

视图

就是一个预定义的查询语句,视图就是一个虚拟的表

视图的优点

  1. 简化日常操作,将很长的sql语句简化成一个单词的名字

  2. 简化业务,将其他部门需要列显示出来即可

  3. 安全性更高,可以隐藏关键和敏感的字段,加上只读之后无法修改原表的数据

  4. 节省网络流量

视图的缺点

隐藏内部逻辑代码,使用的人只能看到结果,不能知道真实情况

示例:a视图由5张表连接,b视图由6张表连接,这个时候a和b连接,就变成了一个很复杂的逻辑。当一个视图与其他一个视图联表查询的时候速度可能会非常慢。

创建视图

create or replace view max_dname as
select dname from dept where deptno=
(select deptno from
(select deptno,count(1) c from emp group by deptno
order by c desc
)a
where rownum=1)
with read only;
  • create 创建视图

  • replace 修改视图的逻辑

  • with read only 禁止修改原表内容,如果不加的话,通过视图可以对原表进行修改

create or replace view emp_3 as

select empno,ename,sal,comm,deptno from emp;

物化视图

是一个真实的表格,将一个select语句的结果,保存成一个真实的表格

快照表

创建物化视图

create materialized view 物化视图名字
refresh on [commit | demand]
start with (start_time) next (next_time)
as select查询语句;

更新方式

跟随原表一起更新 on commit

对原表进行DML操作,然后commit之后,物化视图就会及时更新

create materialized view male_20_stu
refresh on commit
as
select * from students where ssex='男' and sage>20;

定时更新快照表的数据 on demand

原表改变后,不会立即更新,而是按照设置的时间进行更新

create materialized view female_20_stu
refresh on demand
start with sysdate 
next to_date(concat(to_char(sysdate+1,'yyyy-mm-dd'),' 8:00:00'),'yyyy-mm-dd hh24:mi:ss')
as
select * from students where ssex='女' and sage>20;

视图和物化视图的区别?

  1. 视图是虚拟的表格,不会占用我们的磁盘空间

  2. 物化视图是真实的表格,会占用我们的磁盘空间

  3. 视图是随着原表实时更新的,物化视图有提交时更新和需求时更新两种方法

  4. 查询视图实际上是查询的原表,物化视图是查询的结果构成的新表

  5. 可以给物化视图创建索引

手动更新on demand更新方式的更新结果

手动去更新on demand表格的方式

物化视图手动更新方式:

  1. complete 表格全量更新
    先将表格中所有数据全部删除,再将所有数据插入进入
  2. fast 表格的增量更新
    只对改变的数据进行更新
  3. force
    默认的更新方式(fast)
begin                  
    dbms_mview.refresh('物化视图名字','更新方法');
end;

begin
  dbms_mview.refresh(
       'FEMALE_20_STU',
		'COMPLETE'
  );
end;

begin
  dbms_mview.refresh(
       LIST=>'FEMALE_20_STU',
       METHOD=>'COMPLETE',
       PARALLELISM=>4
  );
end;

--如果使用TAB指定表名的话,需要使用多个表名
posted @ 2020-10-07 19:49  Hedger_Lee  阅读(166)  评论(0编辑  收藏  举报