Oracle性能调整是一个范围比较广且有点复杂的主题,普通DBA面对的最大的问题是从哪里开始以及该做些什么。你知道的所有信息可能是有人(一个用户)报告了一个关于应用程序或查询性能下降的问题,当你面对这样的问题时该从何下手呢?
Oracle的调整方法
对那些已经取得了Oracle 8i性能调整认证考试的人而言,有一个试验区域实验Oracle的调整方法,当Oracle 9i发布时Oracle强调了这个方法有所改动,这个方法从8i到9i/10g发生一些变化,两个方法都不完全一样,它们都有各自的优势和缺点,在 Oracle 8i中,由下面的步骤组成:
1、调整业务规则
2、调整数据设计
3、调整应用程序设计
4、调整数据库逻辑结构
5、调整数据库操作
6、调整访问路径
7、调整内存分配
8、调整I/O和物理结构
9、调整资源连接
10、调整基础平台
Oracle 9i的基本原则性方法,原则即优先级顺序:
优先级描述
第一 清楚地定义问题,然后指定一个调整目标
第二 检查主机系统和搜集Oracle统计信息
第三 将识别的问题与Oracle 9i提供的通用数据库性能方法(版本1)/数据库性能计划(版本2)进行对比
第四 使用第二步搜集的统计信息获得一个在系统上可能发生了什么的大概设想
第五 标识所做的改动,然后实施那些改动
第六 确定是否符合第一步中确定的目标,如何符合就停止调整,如果还不符合就重复第五和第六步直到符
合调整目标
Oracle 10g R2性能调整指导认同所有Oracle性能改善方法的处理过程,步骤已经扩展了,但是总体来说还是保留了一些相同的地方。
1、执行下面的初始化标准检查:
a.从用户那里获取真实的反馈,确定性能设计范围和性能目标,以及将来的性能目标,这个过程对未来容量的规划很关键。
b.在性能好和差的时候,都要获取全套操作系统,数据库和从系统获取应用程序统计信息,如果这些不可用,就获取任何有用的信息,丢失统计信息与丢失犯罪证据类似:使得侦探工作更困难并且更浪费时间。
c.对所有涉及用户性能的机器进行操作系统健全检查,通过对操作系统的健全检查,你可以查看被完全利用的硬件和操作系统资源,列出所有过度使用的资源作为后面分析的症状,此外,检查所有硬件错误或进行诊断。
2、检查前十个Oracle常见错误,并确定这些是否可能成为真正的问题,把它们列出来作为后面分析的症状,因为它们代表了大多数可能的问题,ADDM自动检查并报告前十个问题中的九个。查看第6章“自动性能诊断”【http://download-west.oracle.com /docs/cd/B19306_01/server.102/b14211/diagnsis.htm#g41683】和“Oracle系统中发现的前十个错误”【http://download-west.oracle.com/docs/cd/B19306_01/server.102 /b14211/technique.htm#i11221】
3、建立一个在系统上发生了什么的概念模型,使用症状作为提示理解是什么导致了性能问题,查看“一个性能概念模型的简单决策过程” 【http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14211 /technique.htm#i11199】
4、计划一系列补救动作和预先考虑系统的工作情况,然后按顺序应用将使应用程序最大受益,ADDM产生的每个建议都包括了预期的受益分析,不幸的是,系统停机时可能会阻止这样一个严格的调查方法,如果同时应用了多个修改,那么要尝试确保它们是被隔离的,以便可以独立证明每个修改的影响。
5、确认所做的修改是否达到了预期的作用,并了解用户对性能的感受是否有所改善,另外,寻找更多的瓶颈,继续改进概念模型直到你对应用程序的理解更准确。
6、重复后面的三步直到达到性能目标或由于其他约束而变得不可能。
变化是问题的一部分
从一个自顶向下的构造方法到一个以原则为基础的“使它停止伤害”的方法是问题的一部分,搜集统计数据显得很重要因为你如何知道你已经对问题做了改进(或使问题更糟)?对其他方法,你仍然要保留两个最初的问题:我要寻找什么以及我如何使它变得更好?如果结构化方法使你头疼,那原则性方法只会添加混乱。
能够帮助初学者(不承诺:我远远还不够专家的资格)评估(配置、终端和调整)的调整项目清单:
·调整缓冲区高速缓存(Buffer Cache)
·调整重做日志缓冲区(Redo Log Buffer)
·调整共享池内存(Shared Pool Memory)
·优化数据存储器
·优化表空间
·调整Undo段
·检测锁争用
·SQL调整
这些调整措施使得Oracle RDBMS和实例从上到下都更漂亮了,本文剩下的部分将集中在SQL调整或更精密地预防慢速SQL被执行,这些不是同一件事吗?大概是吧,但是在开发方面一个通用的方法是编写执行得够好够块的语句,每条语句不用是最佳的,但是某些思想必须体现在代码中,你没有时间优化成百甚至上千的SQL语句,但同时你可以遵循一些指导方针,以避免常见的错误和不良的编码习惯。
有效避免问题查询的17条提示
这17条提示来源于Hassan Afyouni编写的“Oracle9i性能调整:优化数据库生产率”,这些提示为两个结果打下了坚固的基础:使SQL语句执行效率更佳和确定在这一点上无事可做(如:你已经为SQL语句做了你力所能及的努力,该继续另一个调整项目了)。
这17条提示就是:
1、避免笛卡尔结果
2、避免在大表上全表扫描
3、使用SQL标准和规范减少解析
4、缺少包含在where子句中列的索引
5、避免连接太多的表
6、监视V$session_longops检测长时间运行的操作
7、使用适当的提示
8、使用shared_cursor参数
9、使用基于规则的优化器(如果它比基于成本的优化器要更好的话)
10、避免不必要的排序
11、监视索引变暗(定期删除,必要时重建)
12、小心使用混合索引(不要重复列)
13、监视查询统计情况
14、为表和索引使用不同的表空间(作为一个通用规则,这虽然有点守旧,但主要目的是为了减少I/O争用)
15、在适当的时候使用分区表(和本地索引)(分区是一个额外的成本特性)
16、在where子句中使用直接量(使用绑定变量)
17、保存统计数据时常更新
这是一个相当全面、彻底、准确的列表,步骤9参考了基于规则的优化器的使用,可能引起一个Oracle已经认定作为一个将来的项目特性的依赖或相关性被反对,最后你不得不使用CBO来解决这个问题,因此现在你可能还要开始忘掉CBO,步骤14应该按照减少I/O争用的目标做一些改动而不只停留在它当前描述的为表和索引分配单独的表空间。
小结
本系列的下一篇文章,我们将查看一些这些提示中包含的步骤,例如:在许多网站上给出的关于如何改善SQL语句性能的建议通常都包括“使用绑定变量 ”,我相信许多人都有这样一个问题:“我如何正确地做好这件事?”实际上它相当简单,因为有很多有关如何使用这些提示的详细信息。
本文作者:未知