资源描述:
《OracleSQL优化初步汇总ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、OracleSQL优化初步第一部分基础知识Oracle优化基础影响数据库系统性能的要素:主机CPU,RAM,存储系统;OS参数配置,ORACLE参数配置;应用方面:数据库设计及SQL编程的质量性能问题的木桶效应发现并解决系统性能的瓶颈一个性能优秀的应用系统需要:良好的硬件配置;正确合理的数据库及中间件参数配置;合理的数据库设计;良好的sql编程;运行期的性能优化SQLTunning的重点Sql:insert,update,delete,select;主要关注的是select关注的是:如何用最小的硬件资源消耗、最少的响应时间定位数据位置Sql处理过程SQLPARSE与共享S
2、QL语句为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglobalarea)的共享池(sharedbufferpool)中的内存可以被所有的数据库用户共享.因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径.ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用.sharedbufferpool在允许范围内尽量设大,缓存更多的sql语句.当你向ORACLE提交一个SQL语句,ORA
3、CLE会首先在这块内存中查找相同的语句.严格匹配,(包括空格,换行,bindvariables等).为什么要bindvariables?字符级的比较:SELECT*FROMUSER_FILESWHEREUSER_NO=‘10001234’;与SELECT*FROMUSER_FILESWHEREUSER_NO=‘10004321’;检查:selectname,executionsfromv$db_object_cachewherenamelike'select*fromuser_files%'SQL优化的一般性原则目标:减少服务器资源消耗(主要是磁盘IO);设计方面:尽量依
4、赖oracle的优化器,并为其提供条件;合适的索引,索引的双重效应,列的选择性;编码方面:利用索引,避免大表FULLTABLESCAN;合理使用临时表;避免写过于复杂的sql,不一定非要一个sql解决问题;在不影响业务的前提下减小事务的粒度;使用光标来降低复杂度查询方案类比北京上海广州武汉乌鲁木齐Oracle优化器选用适合的ORACLE优化器,共有3种:a.RULE(基于规则)--RBO(Rule-BasedOpt)b.COST(基于成本)--CBO(Cost-BasedOpt)c.CHOOSE(选择性)–RBO&CBO混合如何配置ORACLE的优化器设置缺省的优化器,可
5、以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS.你当然也在SQL句级或是会话(session)级对其进行覆盖.可以通过showparameterOPTIMIZER_MODE查看为了使用基于成本的优化器(CBO,Cost-BasedOptimizer),你必须经常运行analyze命令,以增加数据库中的对象统计信息(objectstatistics)的准确性.如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关.如果t
6、able已经被analyze过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器.在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(fulltablescan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.RBO的规则从右到左处理表自下而上解析where条件RBO表名顺序ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表drivingtable)将被最先处理.在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORA
7、CLE处理多个表时,会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.RBO的WHERE顺序ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.SELECT…FROMEMPEWHERE25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E