`
xiewanzhi
  • 浏览: 158680 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第三章 锁、表分区

阅读更多

Oracle 第3章 锁、表分区



1、技术目标 

  • 理解锁定的概念
  • 使用表分区


2、锁定的概念 

  • 多个用户可同时访问相同数据,锁是数据库用来控制共享资源并发访问的机制
  • Oracle提供的锁可以确保多用户环境下数据的完整性、一致性
  • 锁能用于保护正在被修改的数据
  • 在提交或回滚事务之前,Oracle会锁定正在被修改的数据,直到提交或回滚了事务之后,锁会自动释放,其他用户才能更新数据 例如:库存中某商品只剩1件,某用户正在在线订购该商品,与该操作相关的数据,也就是这件商品的记录可以锁定,以防止其他用户"同时购买"该商品而修改该记录

大多数情况下,锁不需要开发者干预 ,Oracle会自动完成锁定,比如修改数据时,Oracle提供了锁定操作,以便于需要显示锁定数据时使用。锁定的特点如下:

  • 一致性:一次只允许一个用户修改数据,以保证数据的统一
  • 完整性:提供正确的数据,某用户所修改的数据会反映给所有其他用户
  • 并发性:允许多用户同时访问同一数据,如,某用户正在修改商品库存时,其他用户可以同时查看库存信息,某用户正在更新数据时,其他用户就不能同时删除该数据


3、锁的类型 

锁有两种类型:行级锁 (用于特定行)、表级锁 (用于整个表)

    3.1)行级锁

    对正在被修改的行进行锁定。其他用户可以访问其余的行,如图

    

    行级锁是一种排他锁 ,可防止其他事务修改行,但不会阻止读取,
    在使用insert、update、delete以及select  ... for update等
    语句时,Oracle会自动应用行级锁,select  ... for update 
    语句可每次选择多行记录进行更新,这些记录会被锁定,直到
    回滚或提交该事务后锁才会释放,其他用户才可编辑这些记录
    
    select ... for update语句的完整语法如下:
    select ... for update [of 列名集合] [wait 秒数 | nowait]; 
    of子句指定需要锁定的列
    wait子句指定等待其他用户释放锁的时间(秒),防止无限期等待
    
    使用: 锁定vencode为V002的记录中oDate和delDate两列,然后再修改
    SELECT * FROM orderMaster WHERE vencode=’V002’
            FOR UPDATE OF oDate, delDate;
    UPDATE orderMaster SET delDate=’18-8月-08’ WHERE 
    vencode=’V002’;
    COMMIT;--事务提交后释放锁定 
    
    使用"for update wait"子句的优点有:

  • 防止无期限等待被锁定的行
  • 可在应用程序中对锁定的等待时间进行设置

    
    3.2)表级锁

    表级锁用于保护表数据,使用"lock table "语句显示锁定表。在事务处理中,
    表级锁用来限制对表的添加、更新和删除等操作,具体语法如下:
    lock table 表名 in 锁定模式 mode [nowait];
    nowait关键字可防止无限期等待其他用户释放锁
    锁定模式有如下内容:

  • 行共享(row share, rs):允许其他用户访问和锁定表,禁止排他锁定整个表
  • 行排他(row exclusive, rx):在行共享模式基础上,禁止其他用户在表上使用共享锁
  • 共享(share, s):共享锁将锁定表,只允许其他用户查询表中的行,不允许添加、更新或删除行,多个用户可同时在同一表中设置共享锁(允许资源共享) 例如,每天的结帐操作时需更新日销售额表,可在更新该表示设置共享锁以确保数据一致性
  • 共享行排他(share row exclusive, srx):比共享锁更多的限制,防止其他事务在表上使用共享锁、共享行排他锁以及排他锁
  • 排他(exclusive, x):对表执行的最大限制,其他用户只能查询该表的记录,该锁防止其他事务对表做任何更新或在表上设置任何类型的锁

    使用: 以共享模式锁定orderMaster表
    lock table orderMaster in share mode;
    注意:执行commit或rollback命令可释放锁定 
    
    某用户对表锁定时未使用nowait子句,如该表已被另外的用户
    锁定,那么他将无限期等待,直到锁定该表的用户使用commit
    或rollback语句释放锁
    
4、死锁

当两个事务相互等待对方完成任务时,会出现死锁。比如用户A锁定了对象
X,用户B锁定了对象Y,用户A再锁定Y,用户B再锁定X,两位用户需要等
待对方释放锁,此时两个用户处于僵持状态,无法继续处理业务,这种情况
Oracle会自动检测死锁,通过终止两个事务之一来解决问题,如图




死锁在Oracle中极少出现,一般不用考虑此问题,可以通过人为制造环境来
产生死锁

5、表分区 

Oracle可管理包含海量数据的表,如,公司的订单表可能会增加到百万行,
大小超过2GB,随着表的增大,数据管理随之变得困难,要查找某条记录
需要搜索整个表,会消耗大量的系统资源和时间。Oracle提供的表分区技
术可改善系统性能

表分区允许用户把一个表中的行分为几个部分,不同的部分还可存储在不
同的位置。被分区的表称为分区表,划分出的每一个部分成为一个分区

表分区有许多优势 :

  • 可改善表的查询性能,在对表进行分区后,用户执行SQL查询时可以只访问表中的特定分区
  • 表更容易管理,因为分区表的数据存储在多个部分中,按分区加载和删除数据比在表中加载和删除更容易
  • 便于备份和恢复,可独立备份和恢复每个分区
  • 提高数据安全性,将不同的分区分布在不同的磁盘,可减小所有分区数据同时损坏的可能


应用程序不用知道表已分区,在更新和查询分区表时和普通表的操作一
样,但Oracle优化程序知道表已被分区

注意:要分区的表不能具有LONG和LONG ROW数据类型的列 

Oracle提供4种分区方法:

  • 范围分区
  • 散列分区
  • 复合分区
  • 列表分区


6、范围分区

范围分区根据表的某列或多列的值范围,决定将数据存储在哪个分区上,
比如,可根据序号分区,根据记录的创建日期分区等

创建分区的语法,在create table语句中增加partition子句可创建分区表,
按范围分区的语法为:
create table 表名
(
    ......
)
partition by range (column_name)
(
    partition part1 value less than(range1) [tablespace tbs1],
    partition part2 value less than(range2) [tablespace tbs2],
    ...
    partition partN value less than(rangeN) [tablespace tbsN],
)
语法说明:
column_name 为创建范围分区的列,其列值称为分区键
part1 ... partN 为分区名
range1 ... MAXVALUE 为分区的边界值
tbs1 ... tbsN 为分区所在的表空间,tablespace是可选项

范围分区注意事项:

  • 每个分区的边界值必须小于下一个分区的边界值
  • 每个分区中,只需指定其范围的最大值
  • 所有行的分区键都要小于( < )该分区的边界值
  • 最后一个分区中,MAXVALUE关键字代表边界的最大值,Oracle使用这个分区来存储前面几个分区中不能存储的数据,范围的最小值由Oracle隐含定义


使用1: 购物商场根据销售成本(salesCost)对Sales表中的数据进行分区,
每个分区有一个分区界限用以限制分区范围,按逻辑范围进行分区,
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesCost)
(
    partition P1 values less than (1000),
    partition P2 values less than (2000),
    partition P3 values less than (3000),
);
说明: 
创建Sales表时创建了3个分区,P1分区包含销售成本低于1000的所有
产品,P2分区包含销售成本低于2000但高于或等于1000的所有产品

使用2: 分区列为date数据类型的情况,必须使用年份为4字符格式掩码
的to_date()函数指定分区边界,
create table sales2
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
(
    partition P1 values less than (to_date('2006-01-01', 'YYYY-MM-DD')),
    partition P2 values less than (to_date('2007-01-01', 'YYYY-MM-DD')),
    partition P3 values less than (MAXVALUE),
);
说明: 根据销售日期将表分为3个分区,第一个分区存储2006年以前
的数据,第二个分区存储2006年度的数据,第三个分区存储2007年
以后的数据

7、散列分区

散列分区通过在分区键值上执行一个散列函数 来决定数据的物理位置,
在范围分区中分区键的连续值通常存储在相同的分区中,而散列分区
会把记录平均分布到不同的分区,减少磁盘I/O争用的可能性,

散列分区需要用户指定表所需的分区数目以及存储分区的物理位置,
将散列算法应用于分区键后,散列分区会将数据分布到适当的分区,
语法如下:
partition by hash (column_name)
partitions number_of_partitions [store in (tablespace_list)];
或者
partition by hash (column_name)
(
    partition part1 [tablespace tbs1],
    partition part2 [tablespace tbs2],
    ...
    partition partN [tablespace tbsN],
)
语法说明: 
column_name 为作为基础创建散列分区的列
number_of_partitions 为分区数量,使用这种方式会自动生成分区名
tablespace_list 为分区使用的表空间,如果分区数量超过表空间数量,
        分区会以循环的方式分配到表空间中
part1 ... partN 为分区名

使用1: 创建Employee表,设置4个散列分区,department列为分区键
create table employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by hash(department) partitions 4;

使用2: 创建表MyEmp并设置2个散列分区
create table MyEmp
(
    eId number(4),
    eName varchar2(20)
)
partition by hash(empId)
(
    partition part1,
    partition part2
);

7、复合分区

复合分区是范围分区和散列分区的结合,创建复合分区时,先按范围对
数据进行分区,然后在这些分区内创建散列分区。复合分区即具有范围
分区便于管理的特定,有具有散列分区在数据放置和并行操作方面的优势

复合分区语法:
partition by range (column_name1)
subpartition by hash(column_name2)
subpartition number_of_partitions [store in (tablespace_list)]
(
    partition part1 value less than(range1),
    partition part2 value less than(range2),
    ...
    partition partN value less than(MAXVALUE),
);
语法说明: 
column_name1
column_name2
number_of_partitions
part1 ... partN 为分区名
range 为范围分区的边界值

使用: 创建表Sales,设置复合分区,先根据salesDate列创建4个范
围分区,再根据productId创建子分区,子分区采用散列分区,共创
建5个子分区,总共创建20个子分区
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
subpartition by hash(productId)
subpartitions 5
(
    partition P1 values less than(date '2008-03-01'),
    partition P2 values less than(date '2008-06-01'),
    partition P3 values less than(date '2008-09-01'),
    partition P4 values less than(MAXVALUE),
);

8、列表分区

列表分区允许用户明确地控制行到分区的映射,列表分区允许按自然方式
对无序和不相关的数据集进行分组和组织,语法如下:
partition by list (column_name)
(
    partition part1 values (values_list1),
    partition part2 values (values_list2),
    ...
    partition partN values (DEFAULT)
);
语法说明: 
column_name 为创建列表分区的基础列
part1 ... partN 为分区名
values_list 为对应分区的分区键值列表
DEFAULT 关键字为允许存储前面的分区不能存储的记录

使用: 根据职员住址对Employee表进行分区,north分区只包含地址
为"辽宁"的记录,如果用户输入的值是"广东",则Oracle会拒绝该值,
因为没有创建可以包含该值的分区
create Employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by list(empAddress)
(
    partition north values('辽宁'),
    partition west values('西藏', '青海'),
    partition south values('福建', '海南'),
    partition east values('江苏', '上海')
);

9、按分区查询、删除记录 
使用1: 查询表分区的记录
select * from 表名 partition (分区名);

使用2: 删除表分区的记录
delete from 表名 partition (分区名);

10、分区维护

分区维护是指修改分区表的分区,比如可以向现有表添加新分区,将
分区移动到其他表空间中等等

某些分区维护操作时计划事件,如在历史数据库中,数据库管理员定
期从数据库中删除最旧的分区并添加一组新的分区,该删除和添加操作
将定期执行

其他分区维护操作时费计划事件,用于解决应用程序或系统问题,例如
意料之外的事务处理活动可能会迫使DBA拆分分区以便重新平衡I/O负载

部分分区维护操作如下:

  • 添加分区
  • 删除分区
  • 截断分区
  • 合并分区
  • 拆分分区

    10.1)添加分区 
    alert table 表名 add partition 新分区名 values less than (边界值);
    该语句用于在最后一个分区后添加新分区,如果要在表的开始或中间
    位置添加分区,或者最高分区的分区边界是MAXVALUE,则应使用
    split partition语句
    
    10.2)删除分区 
    alter table 表名 drop partition 分区名;
    删除分区会连分区中的数据一起删除
    
    10.3)截断分区 
    alter table 表名 truncate partition 分区名;
    截断分区会删除表分区中的所有记录

    10.4)合并分区 
    alter table 表名
    merge partitions 分区名1, 分区名2
    into 新分区名;
    可将范围分区或复合分区表的两相邻分区连接起来,合并后的
    分区将继承两个分区的较高上界

    10.5)拆分分区 
    alter table 表名
    split partition 分区名 at (边界值)
    into (partition 新分区名1, partition 新分区名2);
    可在表的开头或中间添加分区,拆分分区允许用户将一个分区
    拆分为两个分区,当分区过大时可对分区进行拆分
    
    使用:将Sales表的P3分区拆分为P31和P32两个分区,原P3分区
    存储2007年以后的数据,拆分为两个分区,一个存放2007年度数
    据,另一个存放2008年以后的数据
    alter table Sales split partition P3 at (date '2008-01-01')
    into (partition P31, partition P32);

11、总结

  • 锁用于保护多用户环境下被修改的数据
  • 锁分为两种级别,即行级锁和表级锁
  • 表分区允许将一个表划分成几部分,以改善大型应用系统的性能
  • 分区方法包括范围分区、散列分区、复合分区和列表分区
  • 分区维护操作包括添加、删除、截断、合并和拆分分区

分享到:
评论

相关推荐

    Oracle第三章锁和分区表.ppt

    Oracle第三章锁和分区表.ppt

    老二牛车第三章上机课锁和表分区.pdf

    老二牛车 第三章上机课锁和表分区.pdf

    老二牛车第三章理论课锁和表分区.pdf

    老二牛车教育第三章理论课锁和表分区.pdf

    北大青鸟Oracle教程集

    第三章 锁和表分区; 第四章 数据库对象; 第五章 Oracle 中的 OOP 概念; 第六章 PL/SQL 简介; 第七章 异常和游标管理; 第八章 子程序和程序包; 第九章 数据库触发器和内置程序包; 第十章 集合和成员函数。

    Oracle幻灯片第三章

    Oracle的锁和表分区 幻灯片形式帮助你学习

    mysql数据库应用与管理视频教程详细完整版

    内容包括dba视频教程中的mysql数据库应用与管理,第一章:配置mysql服务器 第二章:获取元数据 第三章:存储引擎 第四章:隔离级别与锁 第五章:使用分区 第六章:导出与导入数据 第七章:备份与恢复 第八章:使用...

    Oracle 9i&10g编程艺术:深入数据库体系结构

    第3章 文件 第4章 内存结构 第5章 Oracle进程 第6章 锁 第7章 并发与多版本 第8章 事务 第9章 redo与undo 第10章 数据库表 第11章 索引 第12章 数据类型 第13章 分区 第14章 并行执行 第15章 数据加载和卸载

    电脑故障维修指导大全

    4、分区表错误引导的启动故障 43 5、分区有效标志错误引起的硬盘故障 43 6、DOS引导系统引起的启动故障 43 7、FAT表引起的读写故障 43 8、目录表损坏引起的引导故障 44 9、误删除分区时数据的恢复 44 10、误格式化...

    高性能MySQL(第3版).part2

    第3章服务器性能剖析67 3.1性能优化简介67 3.1.1通过性能剖析进行优化69 3.1.2理解性能剖析71 3.2对应用程序进行性能剖析72 3.2.1测量PHP应用程序74 3.3剖析MySQL查询77 3.3.1剖析服务器负载77 3.3.2剖析单...

    python入门到高级全栈工程师培训 第3期 附课件代码

    第3章 01 网络基础和dos命令 02 为何学习linux 03 课程内容介绍 04 操作系统内核与系统调用 05 操作系统安装原理 06 linux操作系统安装 07 初识linux命令 08 linux操作系统目录结构 09 目录及文件操作 第4章 01 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    第三章 Sql查询与函数 一、 SQL概述 SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    第3章 文件 63 .3.1 参数文件 64 3.1.1 什么是参数? 65 3.1.2 遗留的init.ora参数文件 67 3.1.3 服务器参数文件 69 3.1.4 参数文件小结 75 3.2 跟踪文件 76 3.2.1 请求的跟踪文件 77 3.2.2 针对内部错误...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第3部分)

    第3章 命令式任务并行 3.1 创建和管理任务 3.1.1 System.Threading.Tasks.Task 3.1.2 理解Task状态和生命周期 3.1.3 通过使用任务来对代码进行并行化 3.1.4 等待任务完成 3.1.5 忘记复杂的线程 3.1.6 通过...

    SQL Server 2008数据库设计与实现

    第3章 概念阶段数据建模  3.1 理解需求  3.2 文档化过程  3.3 需求收集  3.3.1 客户访谈  3.3.2 要回答的问题  3.3.3 现存的系统和原型  3.3.4 其他类型的文档  3.4 识别对象和过程  3.4.1 识别...

    ORACLE9i_优化设计与系统调整

    第3章 初始化参数、SQL脚本文件 63 §3.1 初始化参数文件 63 §3.2 在参数文件中指定参数值 64 §3.2.1 参数文件中的规则控制 64 §3.2.2 在参数值中使用特殊字符 65 §3.2.3 修改参数值 66 §3.2.4 显示当前参数值 ...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    第3章 故障诊断 72 3.1 影响mysql性能的因素 72 3.2 系统性能评估标准 73 3.2.1 影响linux服务器性能的因素 73 3.2.2 系统性能评估指标 74 3.2.3 开源监控和评估工具介绍 76 3.3 故障与处理 79 3.3.1 连接数...

    SQL Server 2008高级程序设计 5/6

    第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 构建嵌套子查询  3.3 相关子查询  3.4 派生表  3.5 EXISTS运算符  3.6 INTERSECT和EXCEPT运算符  3.7 通用表表达式(CTE)  3.8 递归查询  ...

    SQL Server 2008高级程序设计 4/6

    第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 构建嵌套子查询  3.3 相关子查询  3.4 派生表  3.5 EXISTS运算符  3.6 INTERSECT和EXCEPT运算符  3.7 通用表表达式(CTE)  3.8 递归查询  ...

Global site tag (gtag.js) - Google Analytics