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;
视图
就是一个预定义的查询语句,视图就是一个虚拟的表
视图的优点
-
简化日常操作,将很长的sql语句简化成一个单词的名字
-
简化业务,将其他部门需要列显示出来即可
-
安全性更高,可以隐藏关键和敏感的字段,加上只读之后无法修改原表的数据
-
节省网络流量
视图的缺点
隐藏内部逻辑代码,使用的人只能看到结果,不能知道真实情况
示例: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;
视图和物化视图的区别?
-
视图是虚拟的表格,不会占用我们的磁盘空间
-
物化视图是真实的表格,会占用我们的磁盘空间
-
视图是随着原表实时更新的,物化视图有提交时更新和需求时更新两种方法
-
查询视图实际上是查询的原表,物化视图是查询的结果构成的新表
-
可以给物化视图创建索引
手动更新on demand
更新方式的更新结果
手动去更新
on demand
表格的方式
物化视图手动更新方式:
- complete 表格全量更新
先将表格中所有数据全部删除,再将所有数据插入进入 - fast 表格的增量更新
只对改变的数据进行更新 - 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指定表名的话,需要使用多个表名