1、Oracle性能优化,培训目标?,抛砖引玉参数调优第三方工具,重点了解数据库优化基本原则Oracle诊断工具的使用SQL优化主要手段及原则,软件活动的三要素,原则:行事所依据的准则。,逻辑正确用户参与简化业务实践第一把握重点事先预防持续改进,1,2,3,4,5,6,7,问题分析,网络延迟?,db吃紧?,假设,现象,求证,方案,性能低下,其他如何?,SQL问题?,算法问题?,参数问题?,扩容带宽,其他,优化,重构,调优,结果,定位问题,提出方案,验证方案,执行方案,StackPack报告,安装Statspack的准备单独表空间(90M)设置参数timed_statistics=true在init
2、.ora中设置该参数,并让其生效SQLalter system set timed_statistics=true;STATSPACK的安装SQL ?/rdbms/admin/spcreate.sql;脚本将自动创建PERFSTAT用户,并提示保存STATSPACK统计信息的表空间以及临时表空间,Its history!,AWR报告,Oracle 10g 版本 推出的新特性AutomaticWorkloadRepository负责收集、处理并维护性能统计信息检查和分析性能问题对比StackPack报告:实时+自动,AWR报告,生成标准统计报表JSSWEB$ORACLE_HOME/rdbms/a
3、dmin/awrrpt.sql生成指定SQL的统计报表SQL$ORACLE_HOME/rdbms/admin/awrsqrpt.sql生成不同时间段时的统计对比报表SQL$ORACLE_HOME/rdbms/admin/awrddrpt.sql,AWR报告,擒,贼,擒,王,Top 5 timed events,Top SQL,定位问题,提出方案,验证方案,执行方案,Oracle索引类型,B-tree B-树索引又分为正常型B树和反转型B树Oracle默认索引为B树索引使用广泛,Update代价低,适用于业务系统所有关系型数据库几乎都支持Bitmap 位图索引多应用于数据仓库统计类需求适用Upd
4、ate代价较高,索引创建原则,提高查询语句的效率,减慢了DML语句的速度在全表扫描和索引之间权衡如果全表扫描可以接受,那么慢一些的索引访问也可以接受在哪些列建立索引Where字句中引用的列Join中引用的列在子表的FK上建立索引,防止对父表操作时锁住子表在哪些列上不要建立索引经常有DML操作排它性小Select count(1),count(distinct col_name) from table_name,索引创建原则,不建议表上的索引超过5个能够用组合索引则尽量用组合索引组合索引的靠左原则函数索引很方便,但是要慎用,Stage 1: Create a Cursor Stage 2: Pa
5、rse the StatementStage 3: Bind Any Variables Stage 4: Run the StatementStage 5: Fetch Rows of a QueryStage 6: Close the Cursor,Oracle 如何处理 SQL语句?,RBO和CBO,优化器决定SQL语句的执行路径,对性能至关重要。基于规则的优化器 RBO (Rule Based Optimizer)No change since oracle 7.3,desupported in oracle 10Stable, generate the execution plan
6、according to fixed rulesNot necessary goodDo not support new oracle features(like IOT, partition, materialized view,)基于成本的优化器 CBO (Cost based optimizer)Since oracle 7.3Support all oracle featuresBetter than RBO in most case, Can be bad in some caseChoose the best execution plan according to internal
7、 algorithmNeed to analyze schema to get the best execution plan,Oracle操作优先级,RBO Path 1: Single Row by Rowid(等级最高)RBO Path 2: Single Row by Cluster JoinRBO Path 3: Single Row by Hash Cluster Key with Unique or Primary KeyRBO Path 4: Single Row by Unique or Primary KeyRBO Path 5: Clustered JoinRBO Pat
8、h 6: Hash Cluster KeyRBO Path 7: Indexed Cluster KeyRBO Path 8: Composite IndexRBO Path 9: Single-Column IndexesRBO Path 10: Bounded Range Search on Indexed ColumnsRBO Path 11: Unbounded Range Search on Indexed ColumnsRBO Path 12: Sort Merge JoinRBO Path 13: MAX or MIN of Indexed ColumnRBO Path 14:
9、ORDER BY on Indexed ColumnRBO Path 15: Full Table Scan(等级最低),执行计划,SQL书写原则,同样的SQL只写一次。使用表的别名,降低解析时间。SELECT子句中谨慎使用 * 减少访问数据库的次数用Where子句替换HAVING子句尽量多使用COMMIT 用=替代 用Union all代替union尽量用EXISTS替代IN、用NOT EXISTS替代NOT IN用EXISTS替换DISTINCT,SQL书写原则,少用in、Or关键词避免在索引列上进行计算在条件上多加引号,避免改变数据类型避免在索引列上使用IS NULL和IS NOT NU
10、LL 使用复合索引的第一个列进行查询在索引列上慎用LIKE字句在存储过程中慎用打开超过一万行数据的游标优先使用INT而不是Varchar2优先使用Varchar2,而不是CHAR。避免不必要的排序:distinct、order by,定位问题,提出方案,验证方案,执行方案,在接近生产的环境下测试!,实践第一,实践第一,实践第一,数据存量,统计信息,DB参数,索引分布,什么会影响执行计划,举例一:优化前,举例一:优化后,举例二:优化前,举例二:优化后,举例三:优化前,举例三:优化后,举例四:优化前,举例四:优化后,举例五:优化前,举例五:优化后,举例六:优化前,举例七:优化前,举例七:优化后,举例七:优化后,定位问题,提出方案,验证方案,执行方案,给别人一个表扬你的机会!用户现在体验如何?哪里想要再来一次?,感觉好极了!,学而,习之,合时宜的,适时的,【时】:,结束,不是,是开始,