资源描述:
《【精品】OracleSQL优化调整基础.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、内部项目OracleSQL优化调整基础主题:OracleSQL优化调整基础项H名称:内部项H撰写单位:海鼎作者:吴昭松版本号:0.1H期:2006-07-16审核功能姓名部门签名日期文档历史版本修改原因修改人基于版本日期0.1创建文档吴昭松2006-07-16参考文档编号文档名(链接)1.、八・■刖B我们经常听到客户的抱怨:“某某査询太慢了,执行了半个多小时了还没执行完成。”,“查询还在执行?我都喝完一杯茶了。”我们的冋答有时候是:“数据量太大了,是需要比较长的时间的。”或者“服务器配置太低了,没有办法。”而事实上,有时候服务器的
2、资源却还有空闲。在没有做好充分的评估之前,我们不应该试图说服客户增加服务器配置,因为这样必定会增加客户成木,并不是所育的客户都愿意这样做的。于是,如何利用现有的资源,充分发挥数据库性能的问题摆在了我们血前。Oracle的性能调整涉及很多方血,方法也非常多,我们现在把关注点放在SQL优化调整上。OracleSQL优化调整是Oracleft能调整屮一项菲常耗时的任务,提高低效率SQL的件能,需要不断地尝试,是一个不断反复的过程。木文忽略服务器、网络、磁盘、实例和数据结构设计方面的调整,着垂讲述SQL的优化调整基础。先看一个简单的SQL
3、调整的例子:查询某商场2005年5月^OOr大类,销售额排名前十位商品,SQL优化器选择为RULE:selectscode,snaine,code,name,amountfrom(select/*+RULE*/c.scode,c.sname,b・code,b・name,sum(decode(a・cis,'零售',a.aint+a.tax,'零售退',一&・dint-d.tax))amountfromdrpta,goodsb,sortnamecwherea・gdgid二b・gidanda.cisin('零售',’零售退')anda.
4、fiIdatebetween12005.05.0Tand*2005.05.3Tandb.sortlike'2001%'andsubstr(b・sort,1,4)二c・scodeandc.acode='0000,groupbyc.scode,c.sname,b・code,b・nameorderbysum(decode(a.cis,'裟售',a.amt+a.tax,'零售退',-a・amt-a・tax))desc)ewhererownum<=10;运行上面语句运行时间59.797秒,感觉应该有可调整空间。先看看它的执行计划:Descr
5、iption
6、ObjectowneriObjectname
7、CostCardinality
8、Bytesb^electTtatemenlgoal=hintTrule日COUNTSTOPKEY白VIEWHD40白SORTORDERBYSTOPKEY□SORTGROUPBYBNESTEDLOOPS日NESTEDLOOPSsTABLEACCESSBYINDEXROWIDHD40SORTNAMEINDEXRANGESCANHD40SYS.C0011468BTABLEACCESSBYINDEXROWIDHD40DRPTliiflllNDEXR
9、ANGESCANHD40IDXDRPTFILDATEI-}TABLEACCESSBYINDEXROWIDHD40GOODSINDEXUNIQUESCANHD40SYS.C004850我们发现DRPT是一张大表,使用的索引是IDXDRPTFILDATE(FILDATE,CLS,GDGID)□根据筛选顺序和数据分布,觉得另一个索引1DX_DRPT_GDG1D(GDGID,FILDATE,CLS)可能更适合这个查询。于是在保持RULE优化器的基础上,尝试做如下调整:selectscode,snaine,code,name,amountf
10、rom(select/*+index(a,IDX_DRPT_GDGID)*/c.scode,c.sname,b.code,b.name,sum(decode(tucis,'零售',d・aint+a・tax,'零售退',-d・amt-d・tax))amountfromdrpta,goodsb,sortntunecwherea.gdgid二b.gidanda.cisin('零售','零售退')anda.fiklatebetween12005.05.0Tand'2005.05.31’andb.sortlike'2001%'andsubs
11、tr(b・sort,1,4)二c.scodeandc.acode二’0000,groupbyc.scode,c.snaine,b・code,b.nameorderbysum(decode(a.cis/零售',a.amt+a.tax,'零售退',-a