zoukankan      html  css  js  c++  java
  • 绑定运行计划sql_plan_baseline

    --因为生产环境运行的sql变化较快,版本号公布比較频繁,造成sql的运行计划不是非常稳定。常常会有一些性能非常查的sql出现
    --对于这些sql,我们能够使用sql_plan_baseline对运行计划进行绑定,从而使运行计划固定下来
    --前提是sql最好使用绑定变量。就算有的没有绑定变量,确定字段的值不会改变才行。由于是针对sql_id进行的绑定,假设sql文本改变,绑定也就无意义了

    详细步骤:
    --1、找到问题sql,假设查询sql的运行计划,假设有合适的运行计划。直接进行绑定
    --查询sql运行计划相应的PLAN_HASH_VALUE
    SELECT DISTINCT(PLAN_HASH_VALUE) FROM V$SQL_PLAN t WHERE SQL_ID = '010cv4dvf6swv' and child_number='0'
    --绑定好的运行计划:
    declare
      l_pls number;
    begin
      l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id  => '524wzct86gu1d',
                                                     plan_hash_value => 2554538542,
                                                     enabled         => 'YES');
    end;
    /


    2、假设没有合适的运行计划,就要通过自己分析,运用一些hint让sql产生比較好的运行计划
    --须要绑定的sql
    --oldSQL(id PLAN_HASH_VALUE)
    524wzct86gu1d
    2554538542

    --新的sql
    --newSQL(id PLAN_HASH_VALUE)
    010cv4dvf6swv
    756701203
    --查询新的运行计划的sql_id
    select * from v$sql where sql_text like '%zhruoyu%' --通过在hint中加一下特殊字符来查找

    ---新建制定SQLID的BASELINE依据old_sql id,PLAN_HASH_VALUE
    declare
      l_pls number;
    begin
      l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id    => '524wzct86gu1d',
                                                     plan_hash_value => 2554538542,
                                                     enabled         => 'NO');  --注意这里是no
    end;
    /

    ---确定原始运行计划的 sql_handle
    select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text
    from dba_sql_plan_baselines where origin = 'MANUAL-LOAD' order by created desc
     
    SQL_HANDLE:SQL_66108ad9595208fc                                     
    PLAN_NAME:SQL_PLAN_6c44av5cp427w65e519aa


    ---与正确的运行计划做关联
    declare
      l_pls number;
    begin
      l_pls := DBMS_SPM.load_plans_from_cursor_cache(sql_id          => '010cv4dvf6swv', -- new_SQL_ID'
                                                     plan_hash_value => 756701203, --new_plan_hash_value
                                                     sql_handle      => 'SQL_66108ad9595208fc' --OLD_handle
                                                     );
    end;
    /

    ---删除错误的运行计划
    declare
      l_pls number;
    begin
      l_pls := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => 'SQL_66108ad9595208fc', --sql_handle_for_original
                                               plan_name  => 'SQL_PLAN_6c44av5cp427w65e519aa' --sql_plan_name_for_original                                       
                                               );
    end;
    /

    --检查一下
    select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text
    from dba_sql_plan_baselines where origin = 'MANUAL-LOAD' and sql_handle='SQL_66108ad9595208fc'

    --完毕

  • 相关阅读:
    一句SQL实现MYSQL的递归查询
    人生不过一个字【Life is but a word】
    VS2008 如何将Release版本设置可以调试的DEBUG版本
    微软 2018 年第一笔收购:文件存储公司 Avere Systems
    设置系统时间
    OpenVZ安装指南,一种操作系统级别的虚拟化技术
    云平台DevOps实践
    路由(Routing)
    Ubuntu命令
    net mvc中angular
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5142940.html
Copyright © 2011-2022 走看看