Oracle执行计划详细解读_第1页
Oracle执行计划详细解读_第2页
Oracle执行计划详细解读_第3页
Oracle执行计划详细解读_第4页
Oracle执行计划详细解读_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

解读Oracle执行计划,培训教师:感谢,时间: 2006.4.27,BEGIN,SQL执行流程,1,分析SQL,2,执行,3,查看结果集,4,字段数据转换,检查安全性,检查SQL语法,重写查询,创建执行计划,执行计划执行计划、执行计划:Oracle内部计算机级代码、确定如何访问内存以及获取所需的结果集。 执行计划的主要内容:访问方法、访问顺序。获得执行计划的方式、1.Explain (解释)、2.Autotrace (自动跟踪)、3 .其他工具、基本格式: explainplansetstatement _ id=testplanforselect. (select、insert、update等(适用于SQLPLUS ),备份: Plan_table表、create table _ table (statement _ id varchar2(30 )、timestampdate、remarksvarchar2(80 )和operationvarchar2(30 ) optionsvarchar2(30 )、object_nodevarchar2(128 )、object_ownervarchar2(30 )、object_namevarchar2(30 )、object_instanceinteger和object _ type optimizervarchar2(255 )、search_columnsinteger、idinteger、parent_idinteger、positioninteger、costinteger、cardinalityinteger, bytes integer other _ tag varchar2(255 )、partition_startvarchar2(255 )、partition_stopvarchar2(255 )、partition_idinteger、otherlong、disting 、AUTOTRACE、SQLsetautotraceon; SQL select *来自双重; d-xeexecutonplan-0selectstatementoptimizer=choose 10 tableaccess (满) ofdalstatistics-0recursive calls0dbblockgets 3一致性获得者0 physical reads 0重做大小372字节sent viasql * netto client 511 bytestreceivedviasql * netfromclient2SQL * netroundtripsto/from client0sorts (memory )0sorts (disk )1rowsprocessedsql,统计信息、统计信息使用1删除上次的分析数据,2执行分析,deletefromplan _ tablewhenrestment _ id=test plan;explainplansetstatement _ id=testplanforselect *来自双重; 3、显示说明计划,选择lpad (,(5* (level-1 ) )| operation operation,options,object_name,cost,positionfromplan _ tablestartwithid=0and statement 第一个执行计划,对应于SQL语句:select*fromdual;执行计划:如何看待执行计划,执行计划实际上是树,层次最深的第一次执行,层次相同,上面的第一次执行。 由于显示是分层缩进的,所以从最里面可以看到。 最后一组是驱动器表。 例如:驱动器表、 selectcount(* ) from PRM _ adjustpricemain PRM _ adjust price _ bdetailwhenremain.cadjpriceid=detail.cadjpriceidandmain.dadjpricedate=2004-04-18和detail TPK _ invmandocfrombd _ invmandocwhenrebd _ inv mandoc.sealfflag=n ); 读取表格存取方式、杂凑撷取:全部表格扫描:ROWID存取:表格记录,从第一个区块开始依次识别最后一个旗标。 的双曲馀弦值。 ROWID包括记录的数据块号和数据块中的偏移。 因此,这是取得记录最快的方法。 使用哈希算法检索符号键值,并标识记录所在的数据块。 可以减少读取数据的量,但是存在重新定位记录的问题,只能用于静态表。 索引存取方式、快速全索引扫描:索引扫描:从索引读取一个或多个ROWID。 索引值通常按升序扫描。 有些查询只需扫描索引而不扫描表,即可获得所需的查询结果。 所有查询字段都由索引指定,查询返回索引中所有记录数的10%,并执行Count(* )。Oracle索引:表连接操作1,1,嵌套环连接-NESTEDLOOP,两个表,一个小的内部表和一个外部表,一般速度快,特别是在中间结果集非常小的情况下速度快。 外部表索引,内部表,外部表,表结合操作2,2,哈希结合-哈希结合,两个表,一个小驱动表和一个大表,中间结果集非常大时速度快。、Hash_Area_SizeRAM、驱动器表、大表、散列访问ROWID、RAM溢出使用临时表区域、表连接操作3、3、排序合并连接-MERGEJOIN,两个表都进行全表扫描适合极少数情况。 只有包含两个表的大多数记录的查询是合适的。a表全表扫描、b表全表扫描、a表排序、b表排序、输出结果集、合并、Step1:全表扫描、对查询的影响最大的是全表扫描-表访问完整,计划执行计划中的全表扫描可疑。 如果数据量不是非常小的表,则可能导致全表扫描:表中没有没有索引的WHERE条件,索引字段以to (DCR date )=2005-02-15开头,Like操作符开头的参数以“%”开头Step2:驱动器表-1、驱动器表和最内层驱动器表是否可以在运行时获得最小的中间数据集? 例如,查询订单明细行会涉及三个表格:订单主要表格、订单附表、存货基本文件表格。 条件包括具有订单日期的日期和具有库存代码的值。 案例1 :使用订单主要表格作为驱动表格,您可以使用日期索引来筛选所有当日订单,然后将附表与存货档案表格相关联,最后筛选适当的存货。订单附表、库存文件表、日期索引、主表PK索引、库存主键索引、Step2:驱动表-2、方案2 :如果将库存文件作为驱动表,则使用代码上的索引过滤所有库存,将订单附加关联,得到所有库存满足条件的订单附加表记录、订单附表、订单主表、库存文件表、代码索引、库存ID索引、主表主键索引、结论:根据库存进行过滤,满足订单附表条件的记录变少,方案2更为优秀。 不要为在Step3:中不应创建的索引、错误索引和只有一个可能值的列创建索引。 文件状态、文件主表部门人员、附表仓库、库存组织等。 并不是索引越多越好。 插入、删除和修改数据需要维护索引表,成本高昂。 的双曲馀弦值。 可用作查询条件的所有日期列、客户列表的主表主键列、库存列、来源单据列基本文件的代码栏等。 另外,对于Step4:复合索引列的顺序、复合索引,将重复值少的列作为开头列,例如在订单附表中有源文档类型(srctype )和源文档ID(srcid ),制作索引的顺序以srctid、srctype.srctype列为开头查询时没有srctid的条件也可能使用该索引扫描,结果扫描了大部分表比全表扫描慢。 在Step5:非最佳索引和一个表中包含多个索引的列的情况下,可能会使用非最佳索引进行分析,并使用提示指定使用某个索引(存在SQL兼容性问题,不建议使用),而且不能使用索引整数数据列0,字符类型trim函数,例如,您必须检查此仓库中是否存在未入帐的签出发票。 select count (* ) fromxxwherepk _ inv=:1 and status=0,此查询使用库存索引,但处理速度较慢。 但仔细分析可知,实际运行中未计入的出库单的比例较少,在库存索引中加入状态列,可过滤出更少的数据,速度大幅提高。 Step6:如果存在特定的SQL,则数据的不均匀分布可能会变慢,这可能是由于数据的不均匀分布造成的。 例如,在销售订单时,确定此客户是否有未结算的订单。 SQL语句:这个语句在做很多顾客的时候感觉不到,但是在做某2个顾客的时候速度慢,调查那个执行计划,也使用主表的顾客索引。Select.Fromso_order,so_order_b,whre sor _ order.PK=so _ order _ b.pkandaccountrid=:1 and.最终,企业有批发业务,政策法规不允许直接销售给个人,因为公司内的员工需要购买时全部向统一的特定客户收费执行此类查询会大大消耗数据库资源,从而降低系统的运行速度。 解决办法:这一行为都是现金交易不需要检查,查询的结果永远是空的。 程序绕过这个检查就行了。 Step7:EXIST,查询的基本格式,例如selectcount(* ) from PRM _ adjustpriccemain PRM _ adjust price _ bdetailwhenremain.cadjpriceid=detail.cadjpriceidandmain.cadjpriceidin (12 )和exists (sell ) from BD _ invmandwhenrebd _ inv mandoc.seals flag=nandidetail.cinventoryid=BD _ inv mandoc.PK _ inv mandoc ; 不要将主表中的其他条件写入子查询。 这可能会扫描整个表,因为外部查询没有条件。 要基于子查询中的表执行查询,必须将其更改为IN子句。Select.From主表where主表条件andexists(Select*from子表where子表条件and主表关联字段=子表PK )、Step8:IN、查询的基本格式,例如from PRM _ adjustpricemain PRM _ adjust price _ bdetailwhenremain.cadjpriceid=detail.cadjpriceidandmain.cadjpriceidin (1, 2 ) and detail.cinventoryidin (select PK _ invmandocfrombd _ invmandocwhenrebd _ inv mandoc.sealfflag=n ); 如果不希望根据子查询中的表执行查询,建议将其改为EXIST子句。 特别是在自查询中重复数据较多的情况下。Select.From主表where主表条件and主表关联字段in(Select子表PKfrom子表where子表条件)、Step9:NOTIN,尽量不要使用NOTIN NOTIN可改造为NOTEXISTS。 如果NOTIN子查询在记录中返回空白,则整个结果集将为空。如果Step10:视图、视图或视图集视图不存在,则不要对视图使用Distinct。 不要计算视图中的任何相关列和结果列。 就像月亮的加减一样。 的双曲馀弦值。 不要使用条件过于复杂的视图。 StepOver,如果所有调整都无效:那就是算法问题! 例如,采购计划查询时,首先查询采购计划,然后查询执行数据,追加到采购计划数据中。 查询可执行数据SQL包括selectplanbill.cplanbid,sum(po_planexe.npraysnum ),sumfrom (select po _ plan _ b.cplanbid,po_plan_h.pk_corp, po _ plan _ b.cobj1id po _ plan _ b.cobj2id,po_plan_b.cobj3id,po_plan_h.dstartdate,po_plan_h.denddate,aa.invclasscodeFROMpo_plan_h, po _ plan _ b BD _ invclaawherepo _ plan _ h.cplanhid=po _ plan _ b.cplanhidundopo _ plan _ h.dr=0和po _ plan _ b.dr=0a ndaa.PK _ invcl ()=po _ plan _ b.cobj2idan po _ plan _ h.dprocessdate=planbill.dstateandpo _ planexe.dend date=planbill.de

温馨提示

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

评论

0/150

提交评论