Oracle11g性能调优--使用SQLPlanManagement(2)(一)

2014-11-24 17:02:22 · 作者: · 浏览: 2

本文描述如何使用SQL Plan Management管理SQL执行计划。SQL Plan management通过提供capturing,selecting和evolving SQL Plan信息的组件,来防止由于SQL语句的执行计划突然变化导致的性能下降。

第一部分见http://blog.csdn.net/davidwang9527/article/details/18620953

本文包括如下主题:

3.与SQL Tuning Advisor一起使用SQL Plan Baseline
4.使用Fixed SQL Plan Baseline

5.Displaying SQL Plan Baseline
6.SQL Management Base
7.导出和导入SQL Plan Baseline

3.与SQL Tuning Advisor一起使用SQL Plan Baseline

当使用SQL Tuning Advisor来调优SQL语句时,如果advisor发现一个调优的计划,并验证其性能比从相应的SQL Plan baseline中的计划更好,那么它可以建议接受一个SQL Profile。当SQL Profile被接受后,数据库会将该计划加入到相应的SQL Plan baseline。但是,SQL Tuning Advisor不会验证在plan history中的unaccepted plan。

Oracle11g中,一个自动配置任务在维护窗口中运行SQL Tuning Advisor。这个任务通过在AWR快照中搜集到的执行性能数据来标示出高负载的SQL语句。这个自动配置任务会实施SQL Tuning Advisor的SQL profile建议。因此,数据库会自动将高负载的SQL语句的调优计划加入到SQL Plan baselines中。

4.使用Fixed SQL Plan Baseline

当一个SQL Plan baseline包含至少一个属性Fixed设置为true且已经被enabled的plan是,该SQL Plan baseline就是fixed。可以使用fixed SQL来 Plan baseline为一个SQL语句来固定一组可能的计划(通常是一个计划)。

如果一个fixed的SQL Plan baseline中也包含non-fixed plans,那么优化器会优先选择fixed plan而不选择non-fixed plan。因此,优化器采用fixed plan中的最低成本的计划,即使一个non-fixed plan有更低的成本。

优化器不会添加新的计划到一个fixed SQL plan baseline。因为优化器不会自动添加新的计划,当你执行DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE时,数据库不会进化一个fixed SQL Plan baseline. 但是,您可以通过手动从shared SQL area或者sqL tuning set中加载新计划。

当使用SQL Tuning Advisor来调整一个使用fixed SQL plan baseline的SQL语句时,该SQL profile推荐具有特殊的意义。当SQL profile被接受后,数据库会将调优的计划以non-fixed plan加入到fixed SQL plan baseline。然而,如上所述,优化器当时可重复fixed plan存在时,不会使用tuned plan。因此,无法实现 SQL tuning带来的好处。若要使用该tuned plan,需要手动更改该计划为一个fixed plan(fixed属性改为为YES)。

5.Displaying SQL Plan Baselines

要查看存储在SQL plan baseline的给定语句的计划,使用DBMS_XPLAN包的DISPLAY_SQL_PLAN_BASELINE功能。下面的示例显示指定SQL语句的一个活多个执行计划:

SELECT * FROM TABLE( 
    DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE( 
        sql_handle=>'SYS_SQL_209d10fabbedc741', 
        format=>'basic'));

本例子通过sql_handle,也可以使用plan name来显示单个计划。

此函数使用存储在SQL Management Base的计划信息来解释和显示计划。在这个例子中,DISPLAY_SQL_PLAN_BASELINE功能显示由句柄SYS_SQL_209d10fabbedc741指定的SQL语句的执行计划:

SQL handle: SYS_SQL_209d10fabbedc741
SQL text: select cust_last_name, amount_sold from customers c,
          sales s where c.cust_id=s.cust_id and cust_year_of_birth=:yob
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_bbedc741a57b5fc2
Enabled: YES      Fixed: NO      Accepted: NO      Origin: AUTO-CAPTURE
----------------------------------------------------------------------------------
Plan hash value: 2776326082

----------------------------------------------------------------------------------
| Id  | Operation                                | Name                          |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                               |
|   1 | HASH JOIN                                |                               |
|   2 |   TABLE ACCESS BY INDEX ROWID            | CUSTOMERS                     |
|   3 |     BITMAP CONVERSION TO ROWIDS          |                               |
|   4 |     BITMAP INDEX SINGLE VALUE            | CUSTOMERS_YOB_BIX             |
|   5 |    PARTITION RANGE ALL                   |                               |
|   6 |    TABLE ACCESS FULL                     | SALES                         |
----------------------------------------------------------------------------------

----------------------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_bbedc741f554c408
Enabled: YES