Oracle执行计划讲解复习课程.doc
《Oracle执行计划讲解复习课程.doc》由会员分享,可在线阅读,更多相关《Oracle执行计划讲解复习课程.doc(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。Oracle执行计划讲解-Oracle执行计划讲解看懂Oracle执行计划是优化的第一步,让我们从下面的例子开始吧。下面为补充内容1、创建测试表SQLcreatetabletasselect1id,object_namefromdba_objects;TablecreatedSQLupdatetsetid=99whererownum=1;1rowupdatedSQLcommit;CommitcompleteSQLcreateindext_indont(id);Indexcreatedoracle优化器:
2、RBO和CBO两种,从oracle10g开始优化器已经抛弃了RBO,下面的列子说明CBO大概是怎样的SQLselect/*+dynamic_sampling(t0)*/*fromtwhereid=1;50819rowsselected.ExecutionPlan-Planhashvalue:1376202287-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|195|15405|51(0)|00:00:01|1|TABLEACCESSBYINDEXROWID|T|195|15405|51(0)|00:00:01
3、|*2|INDEXRANGESCAN|T_IND|78|50(0)|00:00:01|-PredicateInformation(identifiedbyoperationid):-2-access(ID=1)现象t表还没有被分析,提示/*+dynamic_sampling(t0)*/*的目的是让CBO无法通过动态采样获取表中的实际数据情况,此时CBO只能根据T表中非常有限的信息(比如表中的extents数量,数据块的数量)来猜测表中的数据。从结果中可以看到CBO猜出表中id=1的有195条,这个数值对于表的总数来说,是一个非常小的值,所以CBO选择了索引而不是全表扫描。而实际情况如下所示:S
4、QLselect*fromtwhereid=12;50819rowsselected.ExecutionPlan-Planhashvalue:1601196873-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|49454|3815K|67(2)|00:00:01|*1|TABLEACCESSFULL|T|49454|3815K|67(2)|00:00:01|-PredicateInformation(identifiedbyoperationid):-1-filter(ID=1)通过动态取样,CBO估算出行数
5、为49454,非常接近于真实50820数目。选择了全表扫描。我们来收集一下统计信息SQLexecdbms_stats.gather_table_stats(user,t,cascade=true);SQLselect*fromtwhereid=1;50819rowsselected.ExecutionPlan-Planhashvalue:1601196873-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|50815|1339K|67(2)|00:00:01|*1|TABLEACCESSFULL|T|50815
6、|1339K|67(2)|00:00:01|-PredicateInformation(identifiedbyoperationid):-1-filter(ID=1)现在扫描过的行数为50815。如果我们更新了所有的id为99看看。SQLupdatetsetid=99;50820rowsupdatedSQLselect*fromtwhereid=99;ExecutionPlan-Planhashvalue:1376202287-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|1|27|2(0)|00:00:0
7、1|1|TABLEACCESSBYINDEXROWID|T|1|27|2(0)|00:00:01|*2|INDEXRANGESCAN|T_IND|1|1(0)|00:00:01|-PredicateInformation(identifiedbyoperationid):-2-access(ID=99)因为没有对表进行分析,所以表中的分析数据还是之前的信息,CBO并不知道。我们可以看出Rows值为1,也就是说CBO人为表T中的ID=99的值只有1条,所有选择仍然是索引。我们收集一把统计信息。SQLexecdbms_stats.gather_table_stats(user,t,cascade=
8、true);PL/SQLproceduresuccessfullycompletedSQLselect*fromtwhereid=99;50820rowsselected.ExecutionPlan-Planhashvalue:1601196873-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|50815|1339K|67(2)|00:00:01|*1|TABLEACCESSFULL|T|50815|1339K|67(2)|00:00:01|-PredicateInformation(identifiedby
9、operationid):-1-filter(ID=99)上面为补充内容,下面正式开始1、sql的执行计划创建测试表SQLcreatetablet1(idint,namevarchar2(1000);TablecreatedSQLcreatetablet2(idint,namevarchar2(1000);TablecreatedSQLcreateindexind_t1ont1(id);IndexcreatedSQLcreateindexind_t2ont2(id);IndexcreatedSQLcreateindexind_t2_nameont2(name);IndexcreatedSQLi
10、nsertintot1selecta.OBJECT_ID,a.OBJECT_NAMEfromall_objectsa;50206rowsinsertedSQLinsertintot2selecta.OBJECT_ID,a.OBJECT_NAMEfromall_objectsawhererownumcommit;CommitcompleteSQLexecdbms_stats.gather_table_stats(user,t1,cascade=true);PL/SQLproceduresuccessfullycompletedSQLexecdbms_stats.gather_table_stat
11、s(user,t2,cascade=true);PL/SQLproceduresuccessfullycompleted2、产生执行计划SQLselect*fromt1,t2wheret1.id=t2.id;20rowsselected.ExecutionPlan-Planhashvalue:828990364-|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|-|0|SELECTSTATEMENT|20|780|43(0)|00:00:01|1|TABLEACCESSBYINDEXROWID|T1|1|28|2(0)|00:00:01|2|NESTE
12、DLOOPS|20|780|43(0)|00:00:01|3|TABLEACCESSFULL|T2|20|220|3(0)|00:00:01|*4|INDEXRANGESCAN|IND_T1|1|1(0)|00:00:01|-PredicateInformation(identifiedbyoperationid):-4-access(T1.ID=T2.ID)Statistics-1recursivecalls0dbblockgets37consistentgets0physicalreads0redosize1452bytessentviaSQL*Nettoclient503bytesrec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 执行 计划 讲解 复习 课程
限制150内