版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OracleERP最正确技术实践E-BusinessSuiteOracle性能优化之执行方案Author: 南生: nansheng.su*hand-china.CreationDate: October19,2014LastUpdated: October19,2014DocumentRef: <DocumentReferenceNumber>Version: DRAFT1AApprovals:<Approver1><Approver2>autote*t"PICOracleLogo"\*Mergeformat CopyNumber _____DocumentControlChangeRecordDateAuthorVersionChangeReference2014-10-19snansDraft1aNoPreviousDocumentReviewersNamePositionDistributionCopyNo.NameLocationLibraryMasterProjectLibraryProjectManagerNoteToHolders:Ifyoureceiveanelectroniccopyofthisdocumentandprintitout,pleasewriteyournameontheequivalentofthecoverpage,fordocumentcontrolpurposes.Ifyoureceiveahardcopyofthisdocument,pleasewriteyournameonthefrontcover,fordocumentcontrolpurposes.ContentsTOC\o"1-4"\h\z\uDocumentControlii1.概要21.1SQL性能优化概要21.2SQL语句缓存21.3驱动表21.4组合索引32.执行方案52.1执行方案概要52.2执行方案案例一个52.3执行方案步骤62.4全表扫描72.5通过ROWID的表存取82.6索引扫描82.74种类型的索引扫描93.未完待续113.OpenandClosedIssuesforthisDeliverable12OpenIssues12ClosedIssues12概要1.1SQL性能优化概要在Oracle数据库应用系统中几乎有80%的性能问题是有糟糕的SQL语句引起的。优化是选择最有效的执行方案来执行SQL语句的过程,这是在处理任何数据的语句中的一个重要步骤。对Oracle来说,执行这样的语句有许多不同的方法,譬如说,将随着以什么顺序访问哪些表或索引的不同而不同。所使用的执行方案可以决定语句能执行得有多快。Oracle中称之为优化器〔Optimizer〕的组件用来选择这种它认为最有效的执行方案。1.2SQL语句缓存为了不重复解析一样的SQL语句(因为解析操作比拟费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行方案存放在存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpool)中的存可以被所有的数据库用户共享。因此,当你执行一个SQL语句时,如果该语句和之前的执行过的*一语句完全一样,并且之前执行的该语句与其执行方案仍然在存中存在,则ORACLE就不需要再进展分析,直接得到该语句的执行路径。ORACLE的这个功能大提高了SQL的执行性能并大大节省了存的使用。使用这个功能的关键是将执行过的语句尽可能放到存中,所以这要求有大的共享池(通过设置sharedbufferpool参数值)和尽可能的使用绑定变量的方法执行SQL语句。--查看sharedbufferpool参数的值:命令:showparametershared_pool_size--我这边的运行结果例如SQL>showparametershared_pool_sizeNAMETYPEVALUEshared_pool_sizebiginteger400M共享池过小,会导致数据库性能降低,通过如下语句修改共享池的大小。--修改共享池大小altersystemsetshared_pool_size=400M1.3驱动表驱动表(DrivingTable)。这个概念用于嵌套与HASH连接中。如果该表返回较多的行数据,则对所有的后续操作有负面影响。一般说来,是应用查询的限制条件后,返回较少行的表作为驱动表,所以如果一个大表在WHERE条件有限制条件(如等值限制),则该大表作为驱动表也是适宜的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行的表作为驱动表。在执行方案中,应该为靠上的那个表。例如:表A:cu*_shipment_headers_all头表表B:cu*_shp_deliveries_all行表情况一:表cu*_shipment_headers_all数据比拟少,作为驱动表。情况二:表cu*_shp_deliveries_all限定查询条件,返回数据少,作为驱动表。1.4组合索引由多个列构成的索引,如createinde*id*_emponemp(col1,col2,col3,……),则我们称id*_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leadingcolumn),在上面的例子中,col1列为引导列。当我们进展查询时可以使用wherecol1=",也可以使用wherecol1="andcol2=",这样的限制条件都会使用索引,但是wherecol2="查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。在Oracle中可以创立组合索引,即同时包含两个或两个以上列的索引。在组合索引的使用方面,Oracle有以下特点:当使用基于规则的优化器〔RBO〕时,只有当组合索引的前导列出现在SQL语句的where子句中时,才会使用到该索引;在使用Oracle9i之前的基于本钱的优化器〔CBO〕时,只有当组合索引的前导列出现在SQL语句的where子句中时,才可能会使用到该索引,这取决于优化器计算的使用索引的本钱和使用全表扫描的本钱,Oracle会自动选择本钱低的访问路径;从Oracle9i起,Oracle引入了一种新的索引扫描方式——索引跳跃扫描〔inde*skipscan〕,这种扫描方式只有基于本钱的优化器〔CBO〕才能使用。这样,当SQL语句的where子句中即使没有组合索引的前导列,并且索引跳跃扫描的本钱低于其他扫描方式的本钱时,Oracle就会使用该方式扫描组合索引;Oracle优化器有时会做出错误的选择,因为它再“聪明〞,也不如我们SQL语句编写人员更清楚表中数据的分布,在这种情况下,通过使用提示〔hint〕,我们可以帮助Oracle优化器作出更好的选择。上面4个例子的测试,可以参考网络教程:.blogs./rootq/archive/2008/10/19/1314669.html执行方案2.1执行方案概要为了执行语句,Oracle可能必须实现许多步骤。这些步骤中的每一步可能是从数据库中物理检索数据行,或者用*种方法准备数据行,供发出语句的用户使用。Oracle用来执行语句的这些步骤的组合被称之为执行方案。执行方案是SQL优化中最为复杂也是最为关键的局部,只有知道了ORACLE在部到底是如何执行该SQL语句后,才能知道优化器选择的执行方案是否为最优的。2.2执行方案案例一个SQL代码:SELECTename,job,sal,dnameFROMscott.emp,scott.deptWHEREemp.deptno=dept.deptnoANDNOTE*ISTS(SELECT*FROMsalgradeWHEREemp.salBETWEENlosalANDhisal)执行方案:执行顺序:执行顺序的原则是:由上至下,从右向左由上至下:在执行方案中一般含有多个节点,一样级别(或并列)的节点,靠上的优先执行,靠下的后执行从右向左:在*个节点下还存在多个子节点,先从最靠右的子节点开场执行。存取方法:1全表扫描〔FullTableScans,FTS或TABLEACESSFULL〕2通过ROWID的表存取〔TableAccessbyROWID或rowidlookup〕3索引扫描〔Inde*Scan或inde*lookup〕2.3执行方案步骤执行方案解析:第3步和第6步分别的从EMP表和SALGRADE表读所有行。第5步在PK_DEPTNO索引中查找由步骤3返回的每个DEPTNO值。它找出与DEPT表中相关联的那些行的ROWID。第4步从DEPT表中检索出ROWID为第5步返回的那些行。由黑色字框指出的步骤在行源上操作,如做2表之间的关联,排序,或过滤等操作。第2步实现嵌套的循环操作(相当于C语句中的嵌套循环),接收从第3步和第4步来的行源,把来自第3步源的每一行与它第4步中相应的行连接在一起,返回结果行到第1步。第1步完成一个过滤器操作。它接收来自第2步和第6步的行源,消除掉第2步中来的,在第6步有相应行的那些行,并将来自第2步的剩下的行返回给发出语句的用户或应用。执行方案步骤:首先,Oracle实现步骤3,并一行一行地将结果行返回给第2步。对第3步返回的每一行,Oracle实现这些步骤:Oracle实现步骤5,并将结果ROWID返回给第4步。Oracle实现步骤4,并将结果行返回给第2步。Oracle实现步骤2,将承受来自第3步的一行和来自第4步的一行,并返回给第1步一行。Oracle实现步骤6,如果有结果行的话,将它返回给第1步。Oracle实现步骤1,如果从步骤6返回行,Oracle将来自第2步的行返回给发出SQL语句的用户。2.4全表扫描为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件。Oracle顺序读取分配给表的每个数据块,直到读到表的最高水线处(highwatermark,HWM,标识表的最后一个数据块)。一个多块读操作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定),而非只读取一个数据块,这极大的减少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以高效实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模式下,每个数据块只被读一次。由于HWM标识最后一块被读入的数据,而delete操作不影响HWM值,所以一个表的所有数据被delete后,其全表扫描的时间不会有改善,一般我们需要使用truncate命令来使HWM值归为0。幸运的是oracle10G后,可以人工收缩HWM的值。由FTS模式读入的数据被放到高速缓存的LeastRecentlyUsed(LRU)列表的尾部,这样可以使其快速交换出存,从而不使存重要的数据被交换出存。使用FTS的前提:在较大的表上不建议使用全表扫描,除非取出数据的比拟多,超过总量的5%--10%,或你想使用并行查询功能时。2.5通过ROWID的表存取行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。为通过ROWID存取表,Oracle首先要获取被选择行的ROWID,或从语句的WHERE子句中得到,或者通过表的一个或多个索引的索引扫描得到。Oracle然后以得到的ROWID为依据定位每个被选择的行。此存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们经常在执行方案中看到该存取方法,如通过索引查询数据。2.6索引扫描通过inde*查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,该次i/o只会读取一个数据库块。在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫由2步组成:(1)扫描索引得到对应的rowid值。(2)通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但对于索引,由于经常使用,绝大多数都已经CACHE到存中,所以第1步的I/O经常是逻辑I/O,即数据可以从存中得到。但是对于第2步来说,如果表比拟大,则其数据不可能全在存中,则其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,极其费时间。所以如果对大表进展索引扫描,取出的数据如果大于总量的5%--10%,使用索引扫描会效率下降很多。2.74种类型的索引扫描索引唯一扫描(inde*uniquescan)索引围扫描(inde*rangescan)索引全扫描(inde*fullscan)索引快速扫描(inde*fastfullscan)索引唯一扫描(inde*uniquescan)通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创立一个索引:createinde*id*_testonemp(ename,deptno,loc)。则selectenamefromempwhereename=‘JACK’anddeptno=‘DEV’语句可以使用该索引。如果该语句只返回一行,则存取方法称为索引唯一扫描。而selectenamefromempwheredeptno=‘DEV’语句则不会使用该索引,因为where子句种没有引导列。如果存在UNIQUE或PRIMARYKEY约束〔它保证了语句只存取单行〕,Oracle经常实现唯一性扫描。参考上面的执行方案截图。索引围扫描(inde*rangescan)使用索引存取多行数据,如果索引是组合索引,如索引唯一扫描所示,且selectenamefromempwhereename=‘JACK’anddeptno=‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进展查询,可此时的存取方法称为索引围扫描。在唯一索引上使用索引围扫描的典型情况下是在谓词(where限制条件)中使用了围操作符(如>、<、<>、>=、<=、between)。索引全扫描(inde*fullscan)与全表扫描对应,也有相应的全索引扫描。在*些情况下,可能进展全索引扫描而不是围扫描,需要注意的是全索引扫描只在CBO模式(基于本钱的优化方式)下才有效。CBO根据统计数值得知进展全索引扫描比进展全表扫描更有效时,才进展全索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。索引快速扫描(inde*fastfullscan)扫描索引中的所有的数据块,与inde*fullscan很类似,但是一个显著的区别就是它不对查询出的数据进展排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。3.未完待续OpenandClosedIssuesfort
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海市重点建设项目社会稳定风险评估报告编制指南
- 四年级数学(上)计算题专项练习及答案汇编
- 海岛雷达塔玻璃钢接闪杆 耐腐蚀玻璃纤维灯杆监控杆 场变放电避雷针
- 酿酒制酒知识培训课件
- 春节汽车市场解析
- 2025版建筑工程施工现场环境保护资金投入保障合同3篇
- 中国卫星网络集团有限公司介绍
- 二零二五年度房产交易资金监管居间合同3篇
- 从《西游记》到《黑神话:悟空》:孙悟空的游戏形象变迁与跨媒介叙事
- 以爱之名反对歧视
- 《榜样9》观后感心得体会二
- 暖通工程合同
- 生产型企业规章管理制度(3篇)
- 钢结构之楼承板施工方案流程
- 2024年营销部工作人员安全生产责任制(2篇)
- ISO 56001-2024《创新管理体系-要求》专业解读与应用实践指导材料之3:4组织环境-4.1理解组织及其环境(雷泽佳编制-2025B0)
- 2024-2030年中国管道检测工程行业前景分析发展规划研究报告
- 新的护理交班模式
- 2024年安徽省高校分类对口招生考试数学试卷真题
- 2024电影数字节目管理中心招聘历年高频难、易错点练习500题附带答案详解
- 棋牌室消防应急预案
评论
0/150
提交评论