试谈Oracle的性能优化课件_第1页
试谈Oracle的性能优化课件_第2页
试谈Oracle的性能优化课件_第3页
试谈Oracle的性能优化课件_第4页
试谈Oracle的性能优化课件_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle的性能优化Oracle的性能优化1本章学习目标

本章将介绍优化和调整Oracle数据库系统的一些相关命令和方法。第九章Oracle的性能优化本章学习目标第九章Oracle的性能优化2本章内容安排

9.1数据库性能优化概述9.2SQL语句的优化

9.3Oracle运行环境的优化

9.4并发事件处理

9.5数据完整性9.7常见问题处理

本章内容安排9.1数据库性能优化概述39.1数据库性能优化概述9.1.1数据库性能优化的内容

9.1.2不同类型系统的优化9.1数据库性能优化概述9.1.1数据库性能优化的内4(1)调整数据结构的设计。(2)调整应用程序结构设计。(3)调整数据库SQL语句。(4)调整服务器内存分配。(5)调整硬盘I/O,这一步是在信息系统开发之前完成的。(6)调整操作系统参数。9.1.1数据库性能优化的内容(1)调整数据结构的设计。9.1.1数据库性能优化的内容51.在线事务处理信息系统(OLTP)这种类型的信息系统一般需要有大量的Insert、Update操作。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的Oracle数据库需要主要考虑下述因素或参数:(1)数据库回滚段是否足够?(2)是否需要建立Oracle数据库索引、聚集、散列?(3)系统全局区(SGA)大小是否足够?(4)SQL语句是否高效?9.1.2不同类型系统的优化1.在线事务处理信息系统(OLTP)9.1.2不同类型系62.数据仓库系统(DataWarehousing)这种信息系统的主要任务是从Oracle的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的Oracle数据库着重考虑下述因素或参数:(1)是否采用B*-索引或者bitmap索引?(2)是否采用并行SQL查询以提高查询效率?(3)是否采用PL/SQL函数编写存储过程?(4)是否有必要建立并行数据库,来提高数据库的查询效率。2.数据仓库系统(DataWarehousing)79.2.2SQL语句优化的具体方法

9.2.1SQL语句的优化规则

9.2SQL语句的优化9.2.2SQL语句优化的具体方法9.2.1SQL89.2.1SQL语句的优化规则

(1)去掉不必要的大表、全表扫描。不必要的大表、全表扫描会造成不必要的输入输出,而且还会拖垮整个数据库;(2)检查优化索引的使用这对于提高查询速度来说非常重要;(3)检查子查询,考虑SQL子查询是否可以用简单连接的方式进行重新书写;(4)调整PCTFREE和PCTUSED等存储参数优化插入、更新或者删除等操作;(5)考虑数据库的优化器;(6)考虑数据表的全表扫描和在多个CPU的情况下考虑并行查询。9.2.1SQL语句的优化规则(1)去掉不必要的大表、91.索引的使用2.SQL语句排序优化3.选择联合查询的联合次序

9.2.2SQL语句优化的具体方法4.SQL子查询的调整1.索引的使用2.SQL语句排序优化3.选择联合查询的联合10

1、索引的使用(1)尽量使用索引是全表扫描还是索引范围扫描主要考虑SQL的查询速度问题。试比较下面两条SQL语句:①语句A:SELECTdname,deptnoFROMdeptWHEREdeptnoNOTIN(SELECTdeptnoFROMemp);②语句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);1、索引的使用11

(2)索引不起作用的情况①存在数据类型隐形转换②列上有数学运算③使用不等于(<>)运算④使用substr字符串函数⑤‘%’通配符在第一个字符⑥字符串连接(||)(2)索引不起作用的情况12

(3)函数的索引例如,日期类型是经常用到的,而且在SQL语句中会使用to_char函数以查询具体的的范围日期。如:select*fromstaff_memberwhereTO_CHAR(birth_day,’YYYY’)=’2003’;可以建立基于函数的索引如:CREATEINDEXInd_emp_birthONstaff_member(to_char((birth_day,’YYYY’));(3)函数的索引132.SQL语句排序优化排序发生的情况如下:SQL中包含groupby子句SQL中包含orderby子句SQL中包含distinct子句SQL中包含minus或union操作2.SQL语句排序优化143.选择联合查询的联合次序联合查询中如涉及到多个表的字段关联及查询,其SQL查询语句联合次序的不同写法,会导致语句对各表具体操作的步骤有不同的次序,所以虽然执行结果相同,但执行效率却不同。

3.选择联合查询的联合次序15

4.SQL子查询的调整(1)关联子查询和非关联子查询非关联查询的开销——非关联查询时子查询只会执行一次,而且结果是排序好的,并保存在一个Oracle的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量的记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。关联查询的开销——对返回到父查询的记录来说,子查询会每行执行一次。因此,必须保证任何可能的时候子查询用到索引。4.SQL子查询的调整16(2)在子查询中慎重使用IN或者NOTIN语句在子查询中慎重使用IN或者NOTIN语句,使用where(NOT)exists的效果要好的多。①带IN的关联子查询是多余的,因为IN子句和子查询中相关的操作的功能是一样的。②为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡尔乘积。③尽量不要使用NOTIN子句。(2)在子查询中慎重使用IN或者NOTIN语句17(3)慎重使用视图的联合查询慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。(3)慎重使用视图的联合查询189.3.2物理I/O的调整

9.3.3CPU的优化调整

9.3.4网络配置的优化

9.3.1内存结构的调整

9.3Oracle运行环境的优化

9.3.5Oracle碎片整理

9.3.6Oracle系统参数的调整

9.3.2物理I/O的调整9.3.3CPU的优化调19内存参数的调整主要是指Oracle数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。1.共享池共享池由两部分构成:共享SQL区和数据字典缓冲区。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。9.3.1内存结构的调整内存参数的调整主要是指Oracle数据库的系统全20(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用率。select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache;共享SQL区的使用率应该在90%以上,否则需要增加共享池的大小。(2)数据库管理员可以执行下述语句,查看数据字典缓冲区的使用率。select(sum(-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache;数据字典缓冲区的使用率也应该在90%以上,否则需要增加共享池的大小。(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用212.数据缓冲区数据库管理员可以通过下述语句,来查看数据库数据缓冲区的使用情况。SELECTname,FROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads');根据查询出来的结果可以计算出数据缓冲区的使用命中率:数据缓冲区的使用命中率=1–(physicalreads/(dbblockgets+consistentgets))这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。2.数据缓冲区223.日志缓冲区数据库管理员可以通过执行下述语句,查看日志缓冲区的使用情况。selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');根据查询出的结果可以计算出日志缓冲区的申请失败率:申请失败率=requests/entries申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区。3.日志缓冲区23(1)在磁盘上建立数据文件前首先运行磁盘碎片整理程序为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果有足够的连续磁盘空间建立数据文件,那么就很容易避免数据文件产生碎片。(2)不要使用磁盘压缩Oracle数据文件不支持磁盘压缩。(3)不要使用磁盘加密加密象磁盘压缩一样增加了一个处理层,降低磁盘读写速度。如果担心自己的数据可能泄密,可以使用dbms_obfuscation包和labelsecurity选择性地加密数据的敏感部分。9.3.2物理I/O的调整(1)在磁盘上建立数据文件前首先运行磁盘碎片整理程序9.3.24(5)使用RAIDRAID的使用应注意:①选择硬件RAID超过软件RAID;②日志文件不要放在RAID5卷上,因为RAID5读性能高而写性能差;③把日志文件和归档日志放在与控制文件和数据文件分离的磁盘控制系统上。(6)分离页面交换文件到多个磁盘物理卷跨越至少两个磁盘建立两个页面文件。可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理内存的两倍。(5)使用RAID251.查看CPU的使用情况使用操作命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar–u命令查看CPU的使用率;NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。9.3.3CPU的优化调整1.查看CPU的使用情况9.3.3CPU的优化调整262.查看SQL语句的解析情况(1)数据库管理员可以执行下述语句来查看SQL语句的解析情况:SELECT*FROMV$SYSSTATWHERENAMEIN('parse_time_cpu','parse_time_elapsed','parse_count_hard');这里:①parse_time_cpu:是系统服务时间。②parse_time_elapsed:是响应时间。而用户等待时间为:waite_time=parse_time_elapsed–parse_time_cpu由此可以得到用户SQL语句平均解析等待时间:用户SQL语句平均解析等待时间=waite_time/parse_count2.查看SQL语句的解析情况27(2)数据库管理员还可以通过下述语句,查看低效率的SQL语句:SELECTBUFFER_GETS,EXECUTIONS,SQL_TEXTFROMV$SQLAREA;优化这些低效率的SQL语句也有助于提高CPU的利用率。(2)数据库管理员还可以通过下述语句,查看低效率的SQL语句283.查看Oracle数据库的冲突情况数据库管理员可以通过v$system_event数据字典中的“latchfree”统计项查看Oracle数据库的冲突情况,如果没有冲突的话,latchfree查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。3.查看Oracle数据库的冲突情况294.CPU的优化调整方法一些优化CPU使用和配置的具体方法有:(1)取消屏幕保护。(2)把系统配置为应用服务器。(3)监视系统中消耗中断的硬件。(4)保持最小的安全审计记录。(5)在专用服务器上运行Oracle。(6)禁止非必须的服务。4.CPU的优化调整方法30网络配置是性能调整的一项很重要的内容,而且很容易隐藏性能瓶颈。(1)配置网卡使用最快速度和有效模式(2)删除不需要的网络协议(3)优化网络协议绑定顺序(4)为Oracle禁止或优化文件共享9.3.4网络配置的优化网络配置是性能调整的一项很重要的内容,而且很311.碎片是如何产生的2.碎片对系统的影响(1)导致系统性能减弱(2)浪费大量的表空间9.3.5Oracle碎片整理1.碎片是如何产生的9.3.5Oracle碎片整理323.自由范围的碎片计算用fsfi——freespacefragmentationindex(自由空间碎片索引)值来直观体现:fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))3.自由范围的碎片计算334.自由范围的碎片整理可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:altertablespacetempdefaultstorage(pctincrease1);这样smon便会将自由范围自动合并,达到碎片整理的目的。也可以采用如下语句,通过手工合并自由范围来达到碎片整理的目的。altertablespacetempcoalesce;4.自由范围的碎片整理345.段的碎片整理段由范围组成,在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典DBA_segments,范围的信息可查看数据字典DBA_extents。如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export(输入/输出)工具来完成。export()命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数,等于全部所分配空间。若这个表关闭,则使用import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:expuser/passwordfile=exp.dmpcompress=ygrants=yindexes=ytables=(table1,table2);若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:impuser/passwordfile=exp.dmpcommit=ybuffer=64000full=y;这种方法可用于整个数据库。另外,应该定期shutdowndatabase,从而清理momery碎片。5.段的碎片整理359.3.6Oracle系统参数的调整

1.SharedPoolandLibraryCachePerformanceTuning(共享池和LibraryCache)共享池调整的技巧主要有:(1)刷共享池刷(Flush)共享池可以使小块的内存合并为大块的内存。当共享池的碎片过多时,能够暂时恢复性能。刷共享池可以使用语句:altersystemflushshared_pool;(2)绑定变量9.3.6Oracle系统参数的调整1.Shared362.BufferCachePerformanceTuning(数据库缓存调整)从缓存调整的角度看,应力求避免以下的问题:(1)“缓存的最近最少使用(LRN)链”(cachebuffersLRUchain)的加锁竞争;(2)“平均写队列”(AverageWriteQueue)长度过大;(3)过多时间花在等待“写完毕等待上”(writecompletewaits);(4)过多时间花在等待“缓冲释放等待”上(freebufferwaits)。2.BufferCachePerformanceTun373.LatchContention(加锁或插销竞争)插销加锁是SGA中保护共享数据结构的低层的串行化机制。插销latch是一类可以非常快的获得和释放的锁。插销锁的实现是依赖于操作系统的,尤其在关于一个进程是否会等待一个锁,和等多久方面。有如下的锁(插销)需要调整:(1)RedoCopy/AllocationLatch:重写日志的复制/分配插销(2)SharedPoolLatch:共享池的插销(3)LibraryCacheLatch:LibraryCache插销3.LatchContention(加锁或插销竞争)384.RedoLogBufferPerformanceTuning(重写日志缓冲的调整)LGWR将重写日志缓冲中的重写项写到重写日志文件中。一旦LGWR将这些项复制到重写日志文件中,用户进程就可以重写这些项。统计项目“redologspacerequests”反映了用户进程等待重写日志缓冲中空间的时间的数字。(1)设置重写日志大小的提示:“redologspacerequests”的值应该接近0。(2)设定合适的重写日志的大小,建议每15-30分钟进行一次重写日志的切换。4.RedoLogBufferPerformance395.QueryPerformanceTuning(查询效率的调整)如果查询运行得很慢,请考虑以下这些方面:(1)希望这个查询运行的有多快以及有理由这样要求吗?(2)优化模式OPTIMIZER_MODE设为何值?(3)查询涉及的索引都是有效的吗?(4)在数据库中有没有其他的长时间运行的查询(大查询)。(5)表和索引上有统计信息吗?(6)统计信息是被计算出来的还是被估计出来的?对于查询的性能调整有两个主要的调试工具:TKPROF和AUTOTRACE。5.QueryPerformanceTuning(查询效406.TemporaryTablespacePerformanceTuning(临时表空间的调整)

临时表空间的调整的技巧如下:如果即使在稳定的状态下也存在很多的排序扩展锁(SortExtentPoollatch)的竞争,应该通过修改临时表空间的DEFAULTSTORAGE子句的NEXT值来增大扩展块的大小。如果存在很多的排序扩展锁(SortExtentPoollatch)的竞争并且这种等待是由于过多的并发的排序造成的,应该增大SORT_AREA_SIZE参数的大小,以使更多的排序能保存在内存中。建议让扩展块的大小和SORT_AREA_SIZE参数相同。6.TemporaryTablespacePerform41

9.4.2锁9.4.1并发事件的产生

9.4并发事件处理9.4.2锁9.4.1并发事件的产生42

数据库是一个共享资源,可为多个应用程序所共享。这些程序可串行运行,但在许多情况下,可能多个程序或一个程序的多个进程并行地运行,这就是数据库的并行操作。在多用户数据库环境中,多个用户程序可并行地存取数据库,如果不对并发操作进行控制,会存取不正确的数据,或破坏数据库数据的一致性。9.4.1并发事件的产生数据库是一个共享资源,可为多个应用程序所共43(1)当一个用户正在修改表中数据的同时,另一个用户正试图删除该表。(2)用户A正试图读取用户B的某个事务中的一些数据,在用户A的事务开始后,该事务由用户B修改和提交。用户A读取用户B提交的数据。这意味着在同一个事务中读取的数据在某个时刻不一致。(3)某个用户对数据进行修改,另一个用户在第一个用户提交事务以前对同一行进行修改;因此,第一个用户所做的改变丢失了。(4)一个用户从另一个用户尚未提交的数据中读取数据;也就是说,在用户B的改变提交以前,用户A读取用户B正在修改的行。(1)当一个用户正在修改表中数据的同时,另一个用户正试图删除449.4.2锁1.锁的功能2.锁的类型3.锁的模式

4.查看相关信息

9.4.2锁1.锁的功能2.锁的类型3.锁的模式4451.锁的功能(1)数据一致性(2)数据并行性(3)数据完整性1.锁的功能46Oracle在两个不同级上提供读一致性:语句级读一致性和事务级一致性。(1)语句级读取一致性(2)事务级读取一致性Oracle在两个不同级上提供读一致性:语句级读一致性和事务472.锁的类型Oracle锁具体分为以下几类:(1)自动锁与显示锁按用户与系统划分,可以分为自动锁与显示锁。①自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。②显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。2.锁的类型48(2)共享锁与排它锁按锁级别划分,可分为共享锁与排它锁。①共享锁:共享锁允许相关资源可以共享,几个用户可同时读同一数据,几个事务可在同一资源上获取共享封锁。共享锁比排它锁具有更高的数据并行性。但拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。②排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。排它锁禁止相关资源的共享,如果一事务以排它方式封锁一资源,仅仅该事务可更改该资源,直至释放排它封锁。(2)共享锁与排它锁49(3)DML锁和DDL锁按操作划分,可分为DML锁、DDL锁。①DML锁又可以分为:行锁、表锁、死锁。行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。表锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCKTABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCKTABLE显示的定义。死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。(3)DML锁和DDL锁50②DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁。排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的排它锁。如使用altertable语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。分析锁:Oracle使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,Oracle使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,Oracle使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,Oracle重新分析编译此语句。②DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁。51(4)内部闩锁内部闩锁是Oracle中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,Oracle首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。(4)内部闩锁523.锁的模式(1)模式0:none。(2)模式1:null空。1级锁有:Select,有时会在v$locked_object出现。(3)模式2:Row-S行共享(RS):共享表锁,subshare。2级锁有:Selectforupdate、LockForUpdate、LockRowShare。selectforupdate当对话使用forupdate子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或selectforupdate操作。3.锁的模式53(4)模式3:Row-X行独占(RX):用于行的修改,subexclusive。3级锁有:Insert、Update、Delete、LockRowExclusive。没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,必须释放掉上一个才能继续工作。(5)模式4:Share共享锁(S):阻止其他DML操作,share。4级锁有:CreateIndex、LockShare。locked_mode为2、3、4不影响DML(insert、delete、update、select等)操作,但DDL(alter、drop等)操作会提示错误。(4)模式3:Row-X行独占(RX):用于行的修改,su54(6)模式5:S/Row-X共享行独占(SRX):阻止其他事务操作,share/subexclusive。5级锁有:LockShareRowExclusive。具体来讲有主外键约束时update/delete...;可能会产生4,5的锁。(7)模式6:exclusive独占(X):独立访问使用,exclusive。6级锁有:Altertable、Droptable、DropIndex、Truncatetable、LockExlusive。数字越大锁级别越高,影响的操作越多。(6)模式5:S/Row-X共享行独占(SRX):阻止其他554.查看相关信息Oracle在动态状态表V$lock中存储与数据库中的锁有关的所有信息。当资源被锁定时,可以检查V$lock表,查看数据库中的各种情况。4.查看相关信息569.5数据完整性

数据完整性是指数据的正确性和相容性。数据的完整性是为了防止数据库存在不符合原义的数据,防止错误信息输入和输出,即数据要遵守由DBA或应用开发者所决定的一组预定义的规则。9.5数据完整性数据完整性是指数据的正确571.数据完整性的类型Oracle应用于关系数据库的表的数据完整性有下列类型:(1)在插入或修改表的行时允许不允许包含有空值的列,称为空与非空规则。(2)唯一列值规则,允许插入或修改的表行在该列上的值唯一。(3)引用完整性规则,同关系模型定义相符。(4)用户对定义的规则,是复杂的完整性检查。1.数据完整性的类型582.完整性约束及其优点完整性约束,是对表的列定义规则的说明性方法。Oracle利用完整性约束机制防止无效的数据进入数据库的基表,如果任何DML执行结果破坏完整性约束,该语句被回滚并返回上一个错误。2.完整性约束及其优点59利用完整性约束实施数据完整性规则有下列优点:(1)定义或更改表时,不需要程序设计,便很容易地编写程序并可消除程序性错误,其功能是由Oracle控制。所以说明性完整性约束优于应用代码和数据库触发器。(2)对表所定义的完整性约束是存储在数据字典中,所以由任何应用进入的数据都必须遵守与表相关联的完整性约束。(3)具有最大的开发能力。当由完整性约束所实施的事务规则改变时,管理员只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。利用完整性约束实施数据完整性规则有下列优点:603.完整性约束的类型Oracle的DBA和应用开始者对列的值输入可使用的完整性约束有下列类型:(1)NOTNULL约束:如果在表的一列的值不允许为空,则需在该列指定NOTNULL约束。(2)UNIQUE键约束:在表指定的列或组列上不允许两行具有重复值时,则需要该列或组列上指定UNIQUE键完整性约束。在UNIQUE键约束定义中的列或组列称为唯一键。所有唯一完整性约束是用索引方法实施。(3)PRIMARYKEY约束:在数据库中每一个表可有一个PRIMARYKEY约束。包含在PRIMARYKEY完整性约束的列或组列称为主键,每个表可有一个主键。Oracle使用索引实施PRIMARYKEY约束。3.完整性约束的类型61(4)FOREIGNKEY约束:在关系数据库中表可通过公共列相关联,该规则控制必须维护的列之间的关系。包含在引用完整性约束定义的列或组列称为外来键。由外来键所引用的表中的唯一键,称为引用键。包含有外来键的表称为子表或从属表。由子表的外来键所引用的表称为双亲表或引用表。如果对表的每一行,其外来键的值必须与主键中一值相匹配,则需指定引用完整性约束。(5)CHECK约束:表的每行对一指定的条件必须是TRUE或未知,则需在一列或列组上指定CHECK完整性约束。如果在发出一个DML语句时,CHECK约束的条件计算得FALSE时,该语句被回滚。(4)FOREIGNKEY约束:在关系数据库中表可通过公共624.数据库触发器数据库触发器,是使用非说明方法实施完整性规则,利用数据库触发器可定义和实施任何类型的完整性规则。4.数据库触发器639.6数据库性能优化工具常用的数据库性能优化工具有:(1)Oracle数据库在线数据字典(2)操作系统工具(3)SQL语言跟踪工具(SQLTRACEFACILITY)(4)OracleEnterpriseManager(OEM)(5)EXPLAINPLANSQL语言优化命令9.6数据库性能优化工具常用的数据库性能优化工具有:649.7.2确定Oracle数据库表中重复的记录9.7.1序号生成器

9.7常见问题处理9.7.2确定Oracle数据库表中重复的记65

(1)Oracle序号生成的命令格式为:create序号名incrementby每次增长数startwith起始序号(2)可以用下面的语句得到当前的序号:selectseq1.currvalfromdual;(3)也可以用下面的语句得到下一个序号:insertintodeptvalues(seq1.nextval,...);9.7.1序号生成器(1)Oracle序号生成的命令格式为:9.7.1序号66(4)删除序号的语句为:DROPSEQUENCEorder_seq;(5)影响Sequence的初始化参数:SEQUENCE_CACHE_ENTRIES=设置能同时被cache的sequence数目(4)删除序号的语句为:671.自关联查询方法2.GROUPBY/HAVING查询方法9.7.2确定Oracle数据库表中重复的记录3.Exceptioninto子句1.自关联查询方法2.GROUPBY/HAVING查询方法681.自关联查询方法Oracle系统中,对于所有的表都存在一个唯一的列,这就是rowid。对该列使用最大(max)或者最小(min)函数可以非常容易地确定重复的行。1.自关联查询方法692.GROUPBY/HAVING查询方法

利用分组函数GROUPBY/HAVING也很容易确定重复的行。以需要创建唯一索引的列分组并统计每组的个数,很明显如果组中记录数超过1个就存在重复的行。2.GROUPBY/HAVING查询方法703.Exceptioninto子句采用altertable命令中的Exceptioninto子句也可以确定出表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeioninto”子句,必须首先创建EXCEPTIONS表。创建该表的SQL脚本文件为utlexcpt.sql。对于NT系统和UNIX系统,Oracle存放该文件的位置稍有不同。将exceptions表和原表通过rowid关联起来即可得到原表中重复的记录。3.Exceptioninto子句71Oracle的性能优化Oracle的性能优化72本章学习目标

本章将介绍优化和调整Oracle数据库系统的一些相关命令和方法。第九章Oracle的性能优化本章学习目标第九章Oracle的性能优化73本章内容安排

9.1数据库性能优化概述9.2SQL语句的优化

9.3Oracle运行环境的优化

9.4并发事件处理

9.5数据完整性9.7常见问题处理

本章内容安排9.1数据库性能优化概述749.1数据库性能优化概述9.1.1数据库性能优化的内容

9.1.2不同类型系统的优化9.1数据库性能优化概述9.1.1数据库性能优化的内75(1)调整数据结构的设计。(2)调整应用程序结构设计。(3)调整数据库SQL语句。(4)调整服务器内存分配。(5)调整硬盘I/O,这一步是在信息系统开发之前完成的。(6)调整操作系统参数。9.1.1数据库性能优化的内容(1)调整数据结构的设计。9.1.1数据库性能优化的内容761.在线事务处理信息系统(OLTP)这种类型的信息系统一般需要有大量的Insert、Update操作。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的Oracle数据库需要主要考虑下述因素或参数:(1)数据库回滚段是否足够?(2)是否需要建立Oracle数据库索引、聚集、散列?(3)系统全局区(SGA)大小是否足够?(4)SQL语句是否高效?9.1.2不同类型系统的优化1.在线事务处理信息系统(OLTP)9.1.2不同类型系772.数据仓库系统(DataWarehousing)这种信息系统的主要任务是从Oracle的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的Oracle数据库着重考虑下述因素或参数:(1)是否采用B*-索引或者bitmap索引?(2)是否采用并行SQL查询以提高查询效率?(3)是否采用PL/SQL函数编写存储过程?(4)是否有必要建立并行数据库,来提高数据库的查询效率。2.数据仓库系统(DataWarehousing)789.2.2SQL语句优化的具体方法

9.2.1SQL语句的优化规则

9.2SQL语句的优化9.2.2SQL语句优化的具体方法9.2.1SQL799.2.1SQL语句的优化规则

(1)去掉不必要的大表、全表扫描。不必要的大表、全表扫描会造成不必要的输入输出,而且还会拖垮整个数据库;(2)检查优化索引的使用这对于提高查询速度来说非常重要;(3)检查子查询,考虑SQL子查询是否可以用简单连接的方式进行重新书写;(4)调整PCTFREE和PCTUSED等存储参数优化插入、更新或者删除等操作;(5)考虑数据库的优化器;(6)考虑数据表的全表扫描和在多个CPU的情况下考虑并行查询。9.2.1SQL语句的优化规则(1)去掉不必要的大表、801.索引的使用2.SQL语句排序优化3.选择联合查询的联合次序

9.2.2SQL语句优化的具体方法4.SQL子查询的调整1.索引的使用2.SQL语句排序优化3.选择联合查询的联合81

1、索引的使用(1)尽量使用索引是全表扫描还是索引范围扫描主要考虑SQL的查询速度问题。试比较下面两条SQL语句:①语句A:SELECTdname,deptnoFROMdeptWHEREdeptnoNOTIN(SELECTdeptnoFROMemp);②语句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);1、索引的使用82

(2)索引不起作用的情况①存在数据类型隐形转换②列上有数学运算③使用不等于(<>)运算④使用substr字符串函数⑤‘%’通配符在第一个字符⑥字符串连接(||)(2)索引不起作用的情况83

(3)函数的索引例如,日期类型是经常用到的,而且在SQL语句中会使用to_char函数以查询具体的的范围日期。如:select*fromstaff_memberwhereTO_CHAR(birth_day,’YYYY’)=’2003’;可以建立基于函数的索引如:CREATEINDEXInd_emp_birthONstaff_member(to_char((birth_day,’YYYY’));(3)函数的索引842.SQL语句排序优化排序发生的情况如下:SQL中包含groupby子句SQL中包含orderby子句SQL中包含distinct子句SQL中包含minus或union操作2.SQL语句排序优化853.选择联合查询的联合次序联合查询中如涉及到多个表的字段关联及查询,其SQL查询语句联合次序的不同写法,会导致语句对各表具体操作的步骤有不同的次序,所以虽然执行结果相同,但执行效率却不同。

3.选择联合查询的联合次序86

4.SQL子查询的调整(1)关联子查询和非关联子查询非关联查询的开销——非关联查询时子查询只会执行一次,而且结果是排序好的,并保存在一个Oracle的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量的记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。关联查询的开销——对返回到父查询的记录来说,子查询会每行执行一次。因此,必须保证任何可能的时候子查询用到索引。4.SQL子查询的调整87(2)在子查询中慎重使用IN或者NOTIN语句在子查询中慎重使用IN或者NOTIN语句,使用where(NOT)exists的效果要好的多。①带IN的关联子查询是多余的,因为IN子句和子查询中相关的操作的功能是一样的。②为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡尔乘积。③尽量不要使用NOTIN子句。(2)在子查询中慎重使用IN或者NOTIN语句88(3)慎重使用视图的联合查询慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。(3)慎重使用视图的联合查询899.3.2物理I/O的调整

9.3.3CPU的优化调整

9.3.4网络配置的优化

9.3.1内存结构的调整

9.3Oracle运行环境的优化

9.3.5Oracle碎片整理

9.3.6Oracle系统参数的调整

9.3.2物理I/O的调整9.3.3CPU的优化调90内存参数的调整主要是指Oracle数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。1.共享池共享池由两部分构成:共享SQL区和数据字典缓冲区。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。9.3.1内存结构的调整内存参数的调整主要是指Oracle数据库的系统全91(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用率。select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache;共享SQL区的使用率应该在90%以上,否则需要增加共享池的大小。(2)数据库管理员可以执行下述语句,查看数据字典缓冲区的使用率。select(sum(-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache;数据字典缓冲区的使用率也应该在90%以上,否则需要增加共享池的大小。(1)数据库管理员通过执行下述语句,来查看共享SQL区的使用922.数据缓冲区数据库管理员可以通过下述语句,来查看数据库数据缓冲区的使用情况。SELECTname,FROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads');根据查询出来的结果可以计算出数据缓冲区的使用命中率:数据缓冲区的使用命中率=1–(physicalreads/(dbblockgets+consistentgets))这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。2.数据缓冲区933.日志缓冲区数据库管理员可以通过执行下述语句,查看日志缓冲区的使用情况。selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');根据查询出的结果可以计算出日志缓冲区的申请失败率:申请失败率=requests/entries申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区。3.日志缓冲区94(1)在磁盘上建立数据文件前首先运行磁盘碎片整理程序为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果有足够的连续磁盘空间建立数据文件,那么就很容易避免数据文件产生碎片。(2)不要使用磁盘压缩Oracle数据文件不支持磁盘压缩。(3)不要使用磁盘加密加密象磁盘压缩一样增加了一个处理层,降低磁盘读写速度。如果担心自己的数据可能泄密,可以使用dbms_obfuscation包和labelsecurity选择性地加密数据的敏感部分。9.3.2物理I/O的调整(1)在磁盘上建立数据文件前首先运行磁盘碎片整理程序9.3.95(5)使用RAIDRAID的使用应注意:①选择硬件RAID超过软件RAID;②日志文件不要放在RAID5卷上,因为RAID5读性能高而写性能差;③把日志文件和归档日志放在与控制文件和数据文件分离的磁盘控制系统上。(6)分离页面交换文件到多个磁盘物理卷跨越至少两个磁盘建立两个页面文件。可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理内存的两倍。(5)使用RAID961.查看CPU的使用情况使用操作命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar–u命令查看CPU的使用率;NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。9.3.3CPU的优化调整1.查看CPU的使用情况9.3.3CPU的优化调整972.查看SQL语句的解析情况(1)数据库管理员可以执行下述语句来查看SQL语句的解析情况:SELECT*FROMV$SYSSTATWHERENAMEIN('parse_time_cpu','parse_time_elapsed','parse_count_hard');这里:①parse_time_cpu:是系统服务时间。②parse_time_elapsed:是响应时间。而用户等待时间为:waite_time=parse_time_elapsed–parse_time_cpu由此可以得到用户SQL语句平均解析等待时间:用户SQL语句平均解析等待时间=waite_time/parse_count2.查看SQL语句的解析情况98(2)数据库管理员还可以通过下述语句,查看低效率的SQL语句:SELECTBUFFER_GETS,EXECUTIONS,SQL_TEXTFROMV$SQLAREA;优化这些低效率的SQL语句也有助于提高CPU的利用率。(2)数据库管理员还可以通过下述语句,查看低效率的SQL语句993.查看Oracle数据库的冲突情况数据库管理员可以通过v$system_event数据字典中的“latchfree”统计项查看Oracle数据库的冲突情况,如果没有冲突的话,latchfree查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。3.查看Oracle数据库的冲突情况1004.CPU的优化调整方法一些优化CPU使用和配置的具体方法有:(1)取消屏幕保护。(2)把系统配置为应用服务器。(3)监视系统中消耗中断的硬件。(4)保持最小的安全审计记录。(5)在专用服务器上运行Oracle。(6)禁止非必须的服务。4.CPU的优化调整方法101网络配置是性能调整的一项很重要的内容,而且很容易隐藏性能瓶颈。(1)配置网卡使用最快速度和有效模式(2)删除不需要的网络协议(3)优化网络协议绑定顺序(4)为Oracle禁止或优化文件共享9.3.4网络配置的优化网络配置是性能调整的一项很重要的内容,而且很1021.碎片是如何产生的2.碎片对系统的影响(1)导致系统性能减弱(2)浪费大量的表空间9.3.5Oracle碎片整理1.碎片是如何产生的9.3.5Oracle碎片整理1033.自由范围的碎片计算用fsfi——freespacefragmentationindex(自由空间碎片索引)值来直观体现:fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))3.自由范围的碎片计算1044.自由范围的碎片整理可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:altertablespacetempdefaultstorage(pctincrease1);这样smon便会将自由范围自动合并,达到碎片整理的目的。也可以采用如下语句,通过手工合并自由范围来达到碎片整理的目的。altertablespacetempcoalesce;4.自由范围的碎片整理1055.段的碎片整理段由范围组成,在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典DBA_segments,范围的信息可查看数据字典DBA_extents。如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export(输入/输出)工具来完成。export()命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数,等于全部所分配空间。若这个表关闭,则使用import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:expuser/passwordfile=exp.dmpcompress=ygrants=yindexes=ytables=(table1,table2);若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:impuser/passwordfile=exp.dmpcommit=ybuffer=64000full=y;这种方法可用于整个数据库。另外,应该定期shutdowndatabase,从而清理momery碎片。5.段的碎片整理1069.3.6Oracle系统参数的调整

1.SharedPoolandLibraryCachePerformanceTuning(共享池和LibraryCache)共享池调整的技巧主要有:(1)刷共享池刷(Flush)共享池可以使小块的内存合并为大块的内存。当共享池的碎片过多时,能够暂时恢复性能。刷共享池可以使用语句:altersystemflushshared_pool;(2)绑定变量9.3.6Oracle系统参数的调整1.Shared1072.BufferCachePerformanceTuning(数据库缓存调整)从缓存调整的角度看,应力求避免以下的问题:(1)“缓存的最近最少使用(LRN)链”(cachebuffersLRUchain)的加锁竞争;(2)“平均写队列”(AverageWriteQueue)长度过大;(3)过多时间花在等待“写完毕等待上”(writecompletewaits);(4)过多时间花在等待“缓冲释放等待”上(freebufferwaits)。2.BufferCachePerformanceTun1083.LatchContention(加锁或插销竞争)插销加锁是SGA中保护共享数据结构的低层的串行化机制。插销latch是一类可以非常快的获得和释放的锁。插销锁的实现是依赖于操作系统的,尤其在关于一个进程是否会等待一个锁,和等多久方面。有如下的锁(插销)需要调整:(1)RedoCopy/AllocationLatch:重写日志的复制/分配插销(2)SharedPoolLatch:共享池的插销(3)LibraryCacheLatch:LibraryCache插销3.LatchContention(加锁或插销竞争)1094.RedoLogBufferPerformanceTuning(重写日志缓冲的调整)LGWR将重写日志缓冲中的重写项写到重写日志文件中。一旦LGWR将这些项复制到重写日志文件中,用户进程就可以重写这些项。统计项目“redologspacerequests”反映了用户进程等待重写日志缓冲中空间的时间的数字。(1)设置重写日志大小的提示:“redologspacerequests”的值应该接近0。(2)设定合适的重写日志的大小,建议每15-30分钟进行一次重写日志的切换。4.RedoLogBufferPerformance1105.QueryPerformanceTuning(查询效率的调整)如果查询运行得很慢,请考虑以下这些方面:(1)希望这个查询运行的有多快以及有理由这样要求吗?(2)优化模式OPTIMIZER_MODE设为何值?(3)查询涉及的索引都是有效的吗?(4)在数据库中有没有其他的长时间运行的查询(大查询)。(5)表和索引上有统计信息吗?(6)统计信息是被计算出来的还是被估计出来的?对于查询的性能调整有两个主要的调试工具:TKPROF和AUTOTRACE。5.QueryPerformanceTuning(查询效1116.TemporaryTablespacePerformanceTuning(临时表空间的调整)

临时表空间的调整的技巧如下:如果即使在稳定的状态下也存在很多的排序扩展锁(SortExtentPoollatch)的竞争,应该通过修改临时表空间的DEFAULTSTORAGE子句的NEXT值来增大扩展块的大小。如果存在很多的排序扩展锁(SortExtentPoollatch)的竞争并且这种等待是由于过多的并发的排序造成的,应该增大SORT_AREA_SIZE参数的大小,以使更多的排序能保存在内存中。建议让扩展块的大小和SORT_AREA_SIZE参数相同。6.TemporaryTablespacePerform112

9.4.2锁9.4.1并发事件的产生

9.4并发事件处理9.4.2锁9.4.1并发事件的产生113

数据库是一个共享资源,可为多个应用程序所共享。这些程序可串行运行,但在许多情况下,可能多个程序或一个程序的多个进程并行地运行,这就是数据库的并行操作。在多用户数据库环境中,多个用户程序可并行地存取数据库,如果不对并发操作进行控制,会存取不正确的数据,或破坏数据库数据的一致性。9.4.1并发事件的产生数据库是一个共享资源,可为多个应用程序所共114(1)当一个用户正在修改表中数据的同时,另一个用户正试图删除该表。(2)用户A正试图读取用户B的某个事务中的一些数据,在用户A的事务开始后,该事务由用户B修改和提交。用户A读取用户B提交的数据。这意味着在同一个事务中读取的数据在某个时刻不一致。(3)某个用户对数据进行修改,另一个用户在第一个用户提交事务以前对同一行进行修改;因此,第一个用户所做的改变丢失了。(4)一个用户从另一个用户尚未提交的数据中读取数据;也就是说,在用户B的改变提交以前,用户A读取用户B正在修改的行。(1)当一个用户正在修改表中数据的同时,另一个用户正试图删除1159.4.2锁1.锁的功能2.锁的类型3.锁的模式

4.查看相关信息

9.4.2锁1.锁的功能2.锁的类型3.锁的模式41161.锁的功能(1)数据一致性(2)数据并行性(3)数据完整性1.锁的功能117Oracle在两个不同级上提供读一致性:语句级读一致性和事务级一致性。(1)语句级读取一致性(2)事务级读取一致性Oracle在两个不同级上提供读一致性:语句级读一致性和事务1182.锁的类型Oracle锁具体分为以下几类:(1)自动锁与显示锁按用户与系统划分,可以分为自动锁与显示锁。①自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。②显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。2.锁的类型119(2)共享锁与排它锁按锁级别划分,可分为共享锁与排它锁。①共享锁:共享锁允许相关资源可以共享,几个用户可同时读同一数据,几个事务可在同一资源上获取共享封锁。共享锁比排它锁具有更高的数据并行性。但拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。②排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。排它锁禁止相关资源的共享,如果一事务以排它方式封锁一资源,仅仅该事务可更改该资源,直至释放排它封锁。(2)共享锁与排它锁120(3)DML锁和DDL锁按操作划分,可分为DML锁、DDL锁。①DML锁又可以分为:行锁、表锁、死锁。行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。表锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCKTABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCKTABLE显示的定义。死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。(3)DML锁和DDL锁121②DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁。排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的排它锁。如使用altertable语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。分析锁:Oracle使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,Oracle使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,Oracle使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,Oracle重新分析编译此语句。②DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁。122(4)内部闩锁内部闩锁是Oracle中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,Oracle首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。(4)内部闩锁1233.锁的模式(1)模式0:none。(2)模式1:null空。1级锁有:Select,有时会在v$locked_object出现。(3)模式2:Row-S行共享(RS):共享表锁,subshare。2级锁有:Selectforupdate、LockForUpdate、LockRowShare。selectforupdate当对话使用forupdate子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或selectforupdate操作。3.锁的模式124(4)模式3:Row-X行独占(RX):用于行的修改,subexclusive。3级锁有:Insert、Update、Delete、LockRowExclusive。没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,必须释放掉上一个才能继续工作。(5)模式4:Share共享锁(S):阻止其他DML操作,share。4级锁有:CreateIndex、LockShare。locked_mode为2、3、4不影响DML(insert、delete、update、select等)操作,但DDL(alter、drop等)操作会提示错误。(4)模式3:Row-X行独占(RX):用于行的修改,su125(6)模式5:S/Row-X共享行独占(SRX):阻止其他事务操作,share/subexclusive。5级锁有:LockShareRowExclusive。具体来讲有主外键约束时update/delete...;可能会产生4,5的锁。(7)模式6:exclu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论