ORACLE培训SQL性能优化

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ORACLE培训--SQL性能优化内容概述课程主要讨论:SQL语句执行的过程、ORACLE优化器,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使大家逐步掌握SQL优化。目录1.优化基础知识2.性能调整综述3.有效的应用设计4.SQL语句的处理过程5.Oracle的优化器6.Oracle的执行计划7.注意事项SQL语句优化的过程定位有问题的语句检查执行计划检查执行过程中优化器的统计信息分析相关表的记录数、索引情况改写SQL语句、使用HINT、调整索引、表分析有些SQL语句不具备优化的可能,需要优化处理方式达到最佳执行计划什么是好的SQL语句?尽量简单,模块化易读、易维护节省资源内存CPU扫描的数据块要少少排序不造成死锁为什么要bindvariables?字符级的比较:SELECT*FROMUSER_FILESWHEREUSER_NO=‘10001234’;与SELECT*FROMUSER_FILESWHEREUSER_NO=:BV1;检查:selectname,executionsfromv$db_object_cachewherenamelike'select*fromuser_files%'什么叫做重编译问题什么叫做重编译?下面这个语句每执行一次就需要在SHAREPOOL硬解析一次,一百万用户就是一百万次,消耗CPU和内存,如果业务量大,很可能导致宕库……如果绑定变量,则只需要硬解析一次,重复调用即可select*fromdConMsgwherecontract_no=32013484095139绑定变量解决重编译问题未使用绑定变量的语句sprintf(sqlstr,insertintoscott.test1(num1,num2)values(%d,%d),n_var1,n_var2);EXECSQLEXECUTEIMMEDIATE:sqlstr;EXECSQLCOMMIT;使用绑定变量的语句strcpy(sqlstr,insertintotest(num1,num2)values(:v1,:v2));EXECSQLPREPAREsql_stmtFROM:sqlstr;EXECSQLEXECUTEsql_stmtUSING:n_var1,:n_var2;EXECSQLCOMMIT;绑定变量的注意事项注意:1、不要使用数据库级的变量绑定参数cursor_sharing来强制绑定,无论其值为force还是similar2、有些带的语句绑定变量后可能导致优化器无法正确使用索引SQL语句的四个处理阶段SQL语句的处理过程解析(PARSE):SQL语句的处理过程1.在共享池中查找SQL语句2.检查语法3.检查语义和相关的权限4.合并(MERGE)视图定义和子查询5.确定执行计划绑定(BIND):SQL语句的处理过程1.在语句中查找绑定变量2.赋值(或重新赋值)执行(EXECUTE):SQL语句的处理过程1.应用执行计划2.执行必要的I/O和排序操作提取(FETCH):1.从查询结果中返回记录2.必要时进行排序3.使用ARRAYFETCH机制共享游标:好处1.减少解析2.动态内存调整3.提高内存使用率书写可共享的SQL绑定变量和共享游标ORACLE优化器模式概述Oracle的优化器共有3种模式:RULE(基于规则)、COST(基于成本)、CHOOSE(基于选择)。设置缺省的优化器的方法,是在启动参数文件中针对OPTIMIZER_MODE参数的各种声明进行选择,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。当然也可以在SQL语句级别或是会话级别对其进行覆盖。为了使用基于成本的优化器(CBO,Cost—BasedOptimizer),必须经常运行analyze命令,以增加数据库中的对象统计信息(objectstatistics)的准确性。如果数据库的优化器模式设置为基于选择,那么实际的优化器模式将和是否运行过analyze命令有关。如果数据表已经被analyze过,优化器模式将自动切换成CBO,反之,数据库将采用RULE形式的优化器。在缺省情况下,Oracle采用CHOOSE优化器。为避免那些不必要的全表扫描,必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。访问数据表的方式①全表扫描全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(databaseblock)的方式优化全表扫描。②通过ROWID访问表ROWID包含了表中记录的物理位置信息。可以采用基于ROWID的访问方式情况提高访问表的效率。Oracle采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能的提高。数据库性能影响数据库系统性能的要素:主机CPU,RAM,存储系统;OS参数配置,ORACLE参数配置;应用方面:数据库设计及SQL编程的质量一个性能优秀的应用系统需要:良好的硬件配置;正确合理的数据库及中间件参数配置;合理的数据库设计;良好的sql编程;运行期的性能优化SQLTunning的重点SQL:insert,update,delete,select;主要关注的是select关注的是:如何用最小的硬件资源消耗、最少的响应时间定位数据位置SQL优化的一般性原则目标:减少服务器资源消耗(主要是磁盘IO);设计方面:尽量依赖oracle的优化器,并为其提供条件;合适的索引,索引的双重效应,列的选择性;编码方面:利用索引,避免大表FULLTABLESCAN;合理使用临时表;避免写过于复杂的sql,不一定非要一个sql解决问题;在不影响业务的前提下减小事务的粒度;优化概括课程Oracle数据库SQL语句优化的总体策略。以这些优化策略为指导,通过经验总结,我们可以不断地丰富优化方案,进而指导我们进行应用系统的数据库性能优化。以下枚举几则被证明行之有效的优化方案:●创建表的时候。应尽量建立主键,尽量根据实际需要调整数据表的PCTFREE和PCTUSED参数;大数据表删除,用truncatetable代替delete。●合理使用索引,在OLTP应用中一张表的索引不要太多。数据重复量大的列不要建立二叉树索引,可以采用位图索引;组合索引的列顺序尽量与查询条件列顺序保持一致;对于数据操作频繁的表,索引需要定期重建,以减少失效的索引和碎片。优化概括●查询尽量用确定的列名,少用*号。selectcount(key)fromtabwherekey0性能优于selectcount(*)fromtab;尽量少嵌套子查询,这种查询会消耗大量的CPU资源;对于有比较多or运算的查询,建议分成多个查询,用unionall联结起来.●尽量多用commit语句提交事务,可以及时释放资源、解锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可以常驻内存:altertable...cache;●在Oracle中动态执行SQL,尽量用execute方式,不用dbms_sql包。sql语句的编写原则和优化在编写SQL语句时我们应清楚优化器根据何种原则来使用索引,这有助于写出高性能的SQL语句。SQL语句的编写原则和SQL语句的优化,请跟我一起学习以下几方面:避免复杂的多表关联select…fromuser_filesuf,df_money_filesdm,cw_charge_recordccwhereuf.user_no=dm.user_noanddm.user_no=cc.user_noand……andnotexists(select…)???很难优化,随着数据量的增加性能的风险很大。避免使用耗费资源的操作带有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能.DISTINCT需要一次排序操作,而其他的至少需要执行两次排序.例如,一个UNION查询,其中每个查询都带有GROUPBY子句,GROUPBY会触发嵌入排序(NESTEDSORT);这样,每个查询需要执行一次排序,然后在执行UNION时,又一个唯一排序(SORTUNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行.嵌入的排序的深度会大大影响查询的效率.通常,带有UNION,MINUS,INTERSECT的SQL语句都可以用其他方式重写.例如:低效:SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO高效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT‘X’FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);用EXISTS替换DISTINCT用UNION-ALL替换UNION(ifpossible)当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序.举例:低效:SELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’UNIONSELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’高效:SELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’UNIONALLSELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’2.给优化器更明确的命令自动选择索引如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.举例:SELECTENAMEFROMEMPWHEREEMPNO=2326ANDDEPTNO=20;这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录.TABLEACCESSBYROWIDONEMPINDEXUNIQUESCANONEMP_NO_IDX至少要包含组合索引的第一列如果索引是建立在多个列上,只有在它的第一个列(leadingcolumn)被where子句引用时,优化器才会选择使用该索引.SQLcreatetablemultiindexusage(indanumber,indbnumber,descrvarchar2(10));Tablecreated.SQLcreateindexmultindexonmultiindexusage(inda,indb);Indexcreated.SQLsetautotracetraceonlySQLselect*frommultiindexusagewhereinda=1;ExecutionPlan----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE10TABLEACCESS(BYINDEXROWID)OF'MULTIINDEXUSAGE'21INDEX(RANGESCAN)OF'MULTINDEX'(NON-UNIQUE)SQLselect*frommultiindexusagewhereindb=1;ExecutionPlan--------------------------------------

1 / 75
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功