锁
概念:是数据库用来控制共享资源并发访问的机制,用来保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据
类型:
1、行级锁:排他锁,防止其他事务修改此行
当使用 insert,update,delete,select...for update语句oracle会自动上锁,可以锁定有一行或者多行,使用commit或rollback释放锁
2、表级锁:锁定整个表,限制其他用户对表的访问
Lock table table_name
分区
事务(重点):
1、原子性:事务是一个整体,不能分割
2、一致性:事务之前和事务之后数据一致
3、隔离性:事务之间互不影响
4、永久性
分区方法:
- 范围分区
概念:以表中的一个列或者一组列的值得范围进行映射到分区
案列:创建customer表,根据表中cus_id的范围创建分区
create table customer( cus_id number primary key, cus_name varchar2(20) not null, cus_email varchar2(30), cus_phone char(11) ) partition by range(cus_id)( partition cus1 values less than(100), partition cus2 values less than(200), partition cus3 values less than(300), partition cus4 values less than(maxvalue) ); drop table customer; insert into customer values(1,‘jack‘,‘132@qq.com‘,‘343‘); insert into customer values(101,‘susan‘,‘132@163.com‘,‘222‘); insert into customer values(201,‘leo‘,‘132@yahu.com‘,‘234‘); --增加分区:错误,分区范围是递增的,增加的分区必须高于最后的分区 alter table customer add partition cus4 values less than(500); |
select * from customer;--查询表的数据 select * from customer partition(cus1);-查询分区表中的数据 |
- 散列分区
概念:允许用户对不具有逻辑范围的数据进行分区,通过在分区键上执行Hash函数决定存储的分区,将数据平均分配到不同的分区。
案列:
--创建表 create table hash_table( col number, inf varchar2(100) ) --编写分区 partition by hash(col)( partition p1, partition p2, partition p3, partition p4 ); --在表中插入值 insert into hash_table values(1,‘优秀‘); insert into hash_table values(101,‘良‘); insert into hash_table values(301,‘中等‘); insert into hash_table values(501,‘及格‘); --查询表中的值 select * from hash_table; --查询表分区的值 select * from hash_table partition(p4); |
- 列表分区
概念:允许用户将不相关的数据组织在一起
案列:创建Student表,通过地区建立分区
create table student( stu_id number,--学生学号 stu_name varchar2(20),--学生姓名 stu_area varchar2(30)--地区 ) partition by list(stu_area)( partition part1 values(‘湖南‘,‘湖北‘,‘江西‘,‘贵州‘,‘广西‘), partition part2 values(‘辽宁‘,‘沈阳‘,‘大连‘,‘北京‘,‘内蒙古‘), partition part3 values(‘江苏‘,‘广州‘,‘上海‘,‘重庆‘) ); --主健约束,非空且唯一 alter table student add constraint s_id primary key(stu_id); --插入值 insert into student values(1,‘jack‘,‘湖南‘); insert into student values(101,‘susan‘,‘北京‘); insert into student values(201,‘anson‘,‘大连‘); insert into student values(301,‘leo‘,‘上海‘); --查询表中的值 select * from student; --查询表分区的值 select * from student partition(part1); |
- 复合分区
概念:范围分区与散列分区或列表分区的组合
select * from student partition(part1); drop table sales; create table sales( pro_id varchar2(20),--商品编号 sales_date date, sales_cost number, status varchar2(20)--商品属性,是否收货 ) partition by range(sales_date) subpartition by list(status)( partition p1 values less than( to_date(‘2017-1-1‘,‘yyyy-mm-dd‘))( subpartition p101 values(‘已收货‘), subpartition p102 values(‘未收货‘) ), partition p2 values less than( to_date(‘2017-6-1‘,‘yyyy-mm-dd‘))( subpartition p201 values(‘已收货‘), subpartition p202 values(‘未收货‘) ) ); --插入值 insert into sales values(‘牛仔裤‘,to_date(‘2017-2-2‘,‘yyyy-mm-dd‘),38,‘已收货‘); insert into sales values(‘毛衣‘,to_date(‘2017-1-2‘,‘yyyy-mm-dd‘),28,‘未收货‘); insert into sales values(‘卫衣‘,to_date(‘2016-2-2‘,‘yyyy-mm-dd‘),30,‘已收货‘); insert into sales values(‘羽绒服‘,to_date(‘2017-5-1‘,‘yyyy-mm-dd‘),38,‘已收货‘); --查询分区值 select * from sales partition(p1); |
分区维护的类型:
1、计划事件-定期删除最旧的分区
2、非计划事件-解决应用程序或者系统问题
分区维护操作:
1、添加分区:在最后一个分区之后添加一个新的分区
alter table customer add partition p5 values less than(value); |
2、删除分区:删除一个指定的分区,分区数值也随之删除
alter table customer drop partition p5; |
--删除复合分区中的自分区 alter table sales drop subpartition p202; |
3、截断分区:删除指定分区中的所有记录
alter table customer truncate partition cus1; --搜索分区cus1中的值 select * from customer partition(cus1);--结果显示无值 |
4、合并分区:将范围分区或复合分区的两个相邻分区连接起来
--将sales表中子分区p101,p102合并在子分区p101中 alter table sales merge subpartitions p101,p102 into subpartition p101; --将sales表区分区中p1,p2合并在分区p1中 alter table sales merge partitions p1,p2 into partition p2; |
拆分分区:将一个大分区的记录拆分到两个分区中
--将customer表的cus4分区拆分成p41,p42分区,小于1500在分区p41中,大于1500的在p42分区中 alter table customer split partition cus4 at(1500) into(partition p41,partition p42); --插入数值 insert into customer values(1601,‘yy‘,‘23‘,‘343‘); --搜索分区p42的值 select * from customer partition(p42); |
总结:
1、一个表中只能有一个partition子句,且分区中的元素不能有冲突 2、范围分区中的范围数是递增的,如果增加一个分区,范围必须大于最高的分区范围 3、如果希望增加一个分区,范围在分区范围中间,选择拆分分区
|