分类: Oracle
2008-04-22 19:48:39
Oracle 11g 允许非常细粒度地控制捕获的SQL计划基线的状态和可用性,而不顾它们的起源,要说明这一点,我准备了三条SQL语句(查看SPM_3_2.sql,我用相似的注释标记它们以好识别),一旦执行,我直接从库缓存中捕获它们的执行计划,最后使用DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE将它们载入SMB中作为SQL计划基线,我应用函数DBMS_SPM.ALTER_SQL_PLAN_BASELINE修改每个SQL计划基线的各种属性,这些修改过的属性包括:
◆ENABLED :设置该属性的值为NO告诉Oracle 11g临时禁用某个计划,一个SQL计划必须同时标记为ENABLED和ACCEPTED,否则CBO将忽略它
◆FIXED:实际上一个SQL计划基线可能比一个执行计划更有参考意义,当这个属性对至少一个SQL计划基线的计划被设置为YES是,那个计划将是优化器唯一的选择,即使如果某个计划可能拥有更低的成本。这让DBA可以撤销SMB的默认行为,对于转换一个存储概要进入一耳光稳定的SQL计划基线特别有用,注意当一个新计划被添加到被标记为FIXED的SQL计划基线,该新计划不能被利用除非它申明为FIXED状态
◆AUTOPURG:设置这个属性的值为NO告诉Oracle 11g无限期保留它,从而不用担心SMB的自动清除机制
列表3.10中的代码展示了我如何设置捕获这些SQL语句以及如何修改这些SQL计划基线的属性。Oracle 11g实际上提供了四个超负荷的方法执行这个功能,我谈到的方法可能非常复杂,因为它接受一个可以过滤的SPM属性,其他三个方法接受一组:
◆一个SQL ID,一个SQL计划基线hash值和一个简单的过滤SQL文本的过滤器
◆一个SQL ID,一个SQL句柄和一个SQL计划基线hash值
◆一个SQL ID,一个SQL计划基线hash值
控制自动SMB管理特性
Oracle 11g也提供了两个自动管理特性,在严格控制下它可以帮助保持SMB的相对大小和内容。
SMB空间管理
Oracle每周会检查SMB的大小是否超过了它的空间预算限制(默认值:SYSAUX表空间的10%),如果超过了限制,会在数据库的警报日志中记录一条警告信息,除非满足下面的条件空间警告信息将一直持续:
◆为SYSAUX表空间分配更多的空间;或者
◆加大空间限制的默认值;或者
◆从SMB中清除SQL计划基线或SQL配置文件
SMB自动清除
每周,有一个自动任务运行用于清除SMB中所有在未用计划保留周期内的SQL计划,这个周期默认是53周,但可以调整为5--523周之间的一个值(如:大约10年)
这些限制可以通过存储过程DBMS_SPM.CONFIGURE来设置,它们当前的值可以通过查询数据字典视图DBA_SQL_MANAGEMENT_CONFIG获取,我在列表3.11中说明了如何修改SMB空间管理的默认设置以及自动清除SMB。
用企业管理器管理SQL计划基线
本文主要集中精力讲述基于脚本的管理SQL计划基线的方法,但是,如果我不叙述Oracle 11g企业管理器数据库控制台也提供了一个非常优秀的接口用于复审和管理SMB的内容,那将对不起读者,图3.1展示了在“服务器”(Server)页面上选择SQL计划控制链接的结果:
图3.1 SQL计划基线管理主面板 |
这个接口使得可以不用任何复杂的PL/SQL代码就可以非常容易地执行下面的SPM功能:
◆启用或禁用某个SQL计划基线
◆为某个选中的SQL计划基线演变一个更好的计划
◆删除一个现有的SQL计划基线
◆打包某个SQL计划基线的内容进入某个临时表
◆打开某个临时表到一个SQL计划基线
图3.1中的例子说明,限制这个屏幕上显示的SQL计划基线列表也是可能的。
结论
这一系列的文章足以说明Oracle 11g的SQL计划管理(SPM)新特性为Oracle DBA提供了一个保证SQL语句能访问绝对最佳的执行计划的强大工具,同时,在SQL语句正式进入生产环境之前,提供了一个稳定其性能的机会,SQL计划基线可以从多个源捕获 -- 甚至从现有的Oracle 10g数据库 -- 可以为新应用程序预先载入以减轻潜在的崩溃可能,使得部署顺利进行,最后,SPM提供了几个方法影响SQL计划基线,基于成本的优化器将为每条独立的SQL语句选择最佳的执行计划,维护当前的SQL计划基线列表,以及自动或手动清除不再使用的SQL计划基线。