分类: Oracle
2008-04-22 19:42:33
为了精确论证SQL计划管理如何为一条SQL语句选择最有效的执行计划,我将从一个相当简单的例子开始:一条SQL语句(查看列表1.1)从销售历史(SH)方案中的几个表中检索一个相对小的数据子集。注意已经用一个恰当的注释(SPM_1.1)标记了该SQL语句,以便在它朝一个可接受的计划基线发展过程中,能很容易地跟踪它的状态。
现在我已经准备好自动捕获SQL计划基线,在列表1.2中显示,我将为这个会话设置OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES初始化参数为TRUE,以激活自动捕获SQL计划基线,并且我将设置OPTIMIZER_MODE为ALL_ROWS,以便CBO优化器优化SQL语句对应的执行计划,返回尽可能是最有效的所有结果集。为了保证该会话会应用任何被捕获的SQL计划基线,我还设置了初始化参数OPTIMIZER_USE_SQL_PLAN_BASELINES为TRUE(它的默认值),这个参数控制CBO是否会检查如果SQL语句再次重复执行时应该被评估以尽可能得到最佳的执行计划。
然后我会执行两次SPM_1.1语句,第一次执行是保证语句的执行被记录到了SMB,第二次执行该语句引起它的执行计划自动接受作为一个SQL计划基线。为了显示我实验中此时SMB的状态,我将执行列表1.3中的查询,它依靠DBA_SQL_PLAN_BASELINES视图,从输出的结果中可以看出,当前的语句实际上已经通过自动捕获被捕获到SMB中了。(注意我已经缩写了SQL语句的hash值和它的计划基线,保留了它们最后的八个字符以便更容易处理)
最后,我将修改OPTIMIZER_MODE参数的值为FIRST_ROWS,以便CBO优化SQL语句相对应的执行计划,尽可能返回前面的几行结果集—明显与ALL_ROWS设置相对,ALL_ROWS力求返回最大的结果集。列表1.4展示了我发布的实现这个的命令,与查询DBA_SQL_PLAN_BASELINES视图的结果一样,这个查询输出清晰地显示了两个执行计划都被存储在SMB中,但是计划07e0351f与计划ddc1fcd0的优化成本2388相比实际上效率更好—它的优化成本只有757,因此,SPM只标记了第一个计划为ENABLED和ACCEPTED。
最后,列表1.5显示了两个执行计划的详细情况,我已经利用DBMS_XPLAN的新存储过程DISPLAY_SQL_BASELINE显示了它们的正确的执行方法,注意SPM已经捕获了相应的SQL计划基线以及它所有的优化器统计。
下一步
我已经介绍了SQL计划管理原理和一些最基本的如何有效使用它的例子,但是还有太多的性能调整情景,在本系列的下一篇文章中,我将深入研究如何:
◆通过手工方法捕获SQL计划基线
◆使用SQL计划基线为应用程序升级进行预演
◆手动演变一个SQL计划基线
参考书目和附加读物
我希望我在本文中已经给你彻底展示了技术方面的特征,同时我相信还有许多更好的文档可供参考,因此,在你尝试在一个生产环境中部署前,我强烈建议你密切关注对应的Oracle文档,以获取更清晰的理解,请注意我已经在下面列出了Oracle数据库11gR1有关的文档:
B28274-01 Oracle Database 11gR1 Performance Tuning Guide
Oracle数据库11gR1性能调整指南
B28279-02 Oracle Database 11gR1 New Features Guide
Oracle数据库11gR1新特征指南
B28419-02 Oracle Database 11gR1 PL/SQL Packages and Types Reference
Oracle数据库11gR1 PL/SQL包和类型参考
下面在Oracle Metalink上的记录也提供了关于Oracle 8i及更高版本存储概要有价值的背景信息:
67536.1: Using Stored Outlines
使用存储概要
102311.1: How to Move Stored Outlines for One Application from One Database to Another
如何为一个应用程序从一个数据库到另外一个数据库移动存储概要
132547.1: Stored Outlines Quick Reference
存储概要快速参考