您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > ORACLESQL性能优化(这个很全的)
ORACLE培训--SQL性能优化内容概述课程主要讨论:SQL语句执行的过程、ORACLE优化器,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使大家逐步掌握SQL优化。目录1.优化基础知识2.性能调整综述3.有效的应用设计4.SQL语句的处理过程5.Oracle的优化器6.Oracle的执行计划7.注意事项一、优化基础知识概述•性能管理•性能问题•调整的方法•SQL优化机制•应用的调整•SQL语句的处理过程–共享SQL区域–SQL语句处理的阶段–共享游标–SQL编码标准•Oracle优化器介绍•SQLTunningTips•优化Tools性能管理•尽早开始•设立合适目标•边调整边监控•相关人员进行合作•及时处理过程中发生的意外和变化•80/20定律SQL优化衡量指标随着软件技术的不断发展,系统性能越来越重要。系统性能主要用:系统响应时间和并发性来衡量。造成SQL语句性能不佳大致有两个原因:1.开发人员只关注查询结果的正确性,忽视查询语句的效率。2.开发人员只关注SQL语句本身的效率,对SQL语句执行原理、影响SQL执行效率的主要因素不清楚。*前者可以通过深入学习SQL语法及各种SQL调优技巧进行解决。SQL调优是一个系统工程,熟悉SQL语法、掌握各种内嵌函数、分析函数的用法只是编写高效SQL的必要条件。*后者从分析SQL语句执行原理入手,指出SQL调优应在优化SQL解析和优化CBO上。调优领域调优领域:1.应用程序级调优:*SQL语句调优*管理变化调优2.实例级调优*内存*数据结构*实例配置3.操作系统交互*I/O*SWAP*Parameters本课程内容只讲解讨论应用程序级:OracleSQL语句调优及管理变化调优调整的方法1.调整业务功能2.调整数据设计3.调整流程设计4.调整SQL语句5.调整物理结构6.调整内存分配7.调整I/O8.调整内存竞争9.调整操作系统不同调整产生相应性能收益调整的角色SQL语句优化是提高性能的重要环节•开发人员不能只注重功能的实现,不管性能如何•开发人员不能把Oracle当成一个黑盒子,必须了解其结构、处理SQL和数据的方法•必需遵守既定的开发规范•未经过SQL语句优化的模块不要上线SQL语句优化的过程•定位有问题的语句•检查执行计划•检查执行过程中优化器的统计信息•分析相关表的记录数、索引情况•改写SQL语句、使用HINT、调整索引、表分析•有些SQL语句不具备优化的可能,需要优化处理方式•达到最佳执行计划什么是好的SQL语句?•尽量简单,模块化•易读、易维护•节省资源内存CPU扫描的数据块要少少排序•不造成死锁SQL共享原理ORACLE将执行过的SQL语句存放在内存的共享池(sharedbufferpool)中,可以被所有的数据库用户共享。当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径.这个功能大大地提高了SQL的执行性能并节省了内存的使用。SQL共享原理为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpoo1)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个功能大大地提高了SQL的执行性能并节省了内存的使用。可惜的是,Oracle只对简单的表提供高速缓冲(cachebufferiIlg),这个功能并不适用于多表连接查询。数据库管理员必须在启动参数文件中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当向Oracle提交一个SQL语句时,Oracle会首先在这块内存中查找相同的语句。SQL共享的三个条件当前被执行的语句和共享池中的语句必须完全相同(包括大小写、空格、换行等)两个语句所指的对象必须完全相同(同义词与表是不同的对象)两个SQL语句中必须使用相同的名字的绑定变量(bindvariables)共享SQL语句注意:Oracle对两者采取的是一种严格匹配策略,要达成共享。SQL语句必须完全相同(包括空格、换行等)。能够使用共享的语句必须满足三个条件:①字符级的比较。当前被执行的语句和共享池中的语句必须完全相同。例如:SELECT*FROMATABLE;和下面每一个SQL语句都不同:SELECT*fromATABLESelect*FromAtable;②语句所指对象必须完全相同即两条SQL语句操作的数据库对象必须同一。③语句中必须使用相同命名的绑定变量。如:第一组的两个SQL语句是相同的,可以共享;而第二组中两个语句不同,即使在运行时赋予不同的绑定变量以相同的值:●第一组selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.pin;●第二组selectpin,namefrompeoplewherepin=:blk1.ot_jnd;selectpin,namefrompeoplewherepin=:blk1.ov_jnd;SQL语句的处理过程共享SQL区域Sql处理过程SQLPARSE与共享SQL语句当一个Oracle实例接收一条sql后1、CreateaCursor创建游标2、ParsetheStatement分析语句3、DescribeResultsofaQuery描述查询的结果集4、DefineOutputofaQuery定义查询的输出数据5、BindAnyVariables绑定变量6、ParallelizetheStatement并行执行语句7、RuntheStatement运行语句8、FetchRowsofaQuery取查询出来的行9、ClosetheCursor关闭游标为什么要bindvariables?•字符级的比较:–SELECT*FROMUSER_FILESWHEREUSER_NO=‘10001234’;与–SELECT*FROMUSER_FILESWHEREUSER_NO=‘10004321’;•检查:–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)fromtabwhereke
本文标题:ORACLESQL性能优化(这个很全的)
链接地址:https://www.777doc.com/doc-10338 .html