分类: Oracle
2008-04-22 19:47:46
本系列前面的文章探讨了Oracle数据库11g新的SQL计划管理(SPM)特色,它可以用于Oracle10g升级到Oracle11g时捕获和载入SQL计划基线,以便在数据库升级过程中消除SQL语句性能倒退,前面的文章也讲述了如何保证新应用程序代码在部署到生产环境之前,为SQL语句选择最有效的执行计划。
本文将讲述如何使用SPM:
◆当它们尝试利用Oracle11g新的优化器特色时,限制SQL语句性能不必要的倒退。
◆通过手工方法捕获特定SQL语句的SQL计划基线。
◆控制现有SQL计划基线的演变。
◆管理SQL计划管理基线(SMB)的内容,包括如何清除过时的或不希望有的SQL计划基线。
SPM情景#3:依靠前面的优化器版本使用SQL性能分析器(SPA)
在前面文章中的第一个情景讲述了如何使用SPM为SQL语句捕获SQL计划基线,该SQL语句的性能在实施Oracle10g升级到Oracle11g的过程中可能倒退。那个情景实际上涉及到在一个现有的Oracle10g数据库中执行该SQL语句组成的SQL工作负载。解决这个问题的一个可选的方法是在一个现有的Oracle11g数据库环境中通过控制初始化参数OPTIMIZER_FEATURES_ENABLE的值模拟一个Oracle10g环境。
模拟准备
要说明这个情景,我将利用前面文章中SPM情景#2中SQL调整集STS_SPM_200中捕获的相同的SQL语句,在我执行任何新的分析之前,我将从SQL管理库(SMB)中移除早先创建的所有SQL计划基线,我将使用函数DBMS_SPM.DROP_SQL_PLAN_BASELINE移除那些标记有注释字符串“SPM_2”的语句(查看列表3.1),然后,我会准备一个新的名叫SPA_SPM_300的SQL性能分析器(SPA)任务,它将分析STS_SPM_200 SQL调整集中的SQL工作负载的性能(查看列表3.2)。
分析SQL工作负载
接下来,我将瞄准SPA任务SPA_SPM_300,评估在Oracle10gR2和Oracle11gR1数据库环境之间模拟的工作负载性能,首先我会清除我的Oracle11g的库缓存和数据库缓存,确保提供一个干净的性能评估起点。然后,我会设置初始化参数OPTIMIZER_FEATURES_ENABLE的值为10.0.0.0,欺骗优化器相信它是一个Oracle10g数据库,最后,我会通过执行SPA_SPM_300一次测试分析那个模式下的性能,一旦这个顺序完成了,我将设置OPTIMIZER_FEATURES_ENABLE的值为11.1.0.6,然后重复相同的分析,SPA将在Oracle11g环境下评估工作负载,这里用到的代码在列表3.3中。
比较相关的工作负载性能
一旦这两个工作负载执行测试完成,我下一个任务是判断是否有SQL语句因为优化器设置改变而性能倒退了,我使用的代码在列表3.4中,它们比较两个工作负载模拟情况,然后生成一个关于哪些SQL语句性能下降了的报告。为了在这里展示SQL性能分析器的灵活性,我避开使用一个相对变化的优化成本作为我的度量值,相反,我选择基于估计执行时间进行SQL语句比较。
为性能倒退的SQL语句捕获SQL计划基线
与分析报告显示的结果一样,在模拟从10.2.0.1升级到11.1.0.6时,有两条SQL语句产生了负面的影响(性能降低了),我将捕获这些语句的执行计划到SQL计划基线中,这将防止CBO使用11g优化器设置运行这些SQL语句,它会因这些语句引起有害的性能,列表3.5中的代码说明了如何实现这个。