• 如何使用coe_load_sql_profile.sql来固定sql profile


    SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile.

    1.

    SQL> -- 对emp的列ename创建一个索引
    SQL> create index i_emp_ename on scott.emp(ename);
    SQL> --收集统计信息
    SQL> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'EMP')

    2.运行原始的SQL语句

    SQL> select ename from scott.emp where ename='MILLER'; 
    ENAME
    ----------
    MILLER
    
    执行计划如下:
    -------------------------------
    SQL_ID  329d885bxvrcr          
    -------------------------------
    Plan hash value: 4001599462
    -------------------------------------------------
    | Id  | Operation        | Name        | E-Rows |
    -------------------------------------------------
    |   0 | SELECT STATEMENT |             |        |
    |*  1 |  INDEX RANGE SCAN| I_EMP_ENAME |      1 |
    -------------------------------------------------

    --这是我们需要更改的plan

    3. 运行带有hint的SQL

    SQL> select /*+ FULL (EMP) */ ename from scott.emp where ename='MILLER'; 
    
    执行计划如下:
    -------------------------------
    SQL_ID  4f74t4ab7rd5y
    -------------------------------
    Plan hash value: 3956160932
    -------------------------------------------
    | Id  | Operation         | Name | E-Rows |
    -------------------------------------------
    |   0 | SELECT STATEMENT  |      |        |
    |*  1 |  TABLE ACCESS FULL| EMP  |      1 |
    -------------------------------------------

    --这是我们需要的plan

    4: 可以通过下面的SQL获取这2个SQL的sql_id和plan_hash_value

    SQL> select sql_id ,plan_hash_value, sql_text from v$sql where sql_text like '%scott.emp%';
    SQL_ID        PLAN_HASH_VALUE SQL_TEXT
    ------------- --------------- ----------------------------------------------------------------------------------------
    4f74t4ab7rd5y      3956160932 select /*+ FULL (EMP) */ ename from scott.emp where ename='MILLER'
    329d885bxvrcr      4001599462 select ename from scott.emp where ename='MILLER'
    
    --329d885bxvrcr   - 这是原始语句的SQL ID
    --4f74t4ab7rd5y   - 这是使用hint的SQL ID
    --3956160932      - 这是需要替换的plan hash value.

    5.进行plan的替换
    --这两个计划都需要在缓存或AWR中
    --需要以具有DBA权限的用户身份连接,例如SYSTEM

    SQL> conn system
    SQL> @coe_load_sql_profile.sql
    Parameter 1:
    ORIGINAL_SQL_ID (required)
    输入 1 的值:  329d885bxvrcr
    
    Parameter 2:
    MODIFIED_SQL_ID (required)
    
    输入 2 的值:  4f74t4ab7rd5y
    
    Parameter 3:
    PLAN_HASH_VALUE (required)
    
    输入 3 的值:  3956160932
    
    Values passed to coe_load_sql_profile:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ORIGINAL_SQL_ID: "329d885bxvrcr"
    MODIFIED_SQL_ID: "4f74t4ab7rd5y"
    PLAN_HASH_VALUE: "3956160932"
    
    ORIGINAL:329D885BXVRCR MODIFIED:4F74T4AB7RD5Y PHV:3956160932 SIGNATURE:15822026218863957422 CREATED BY COE_LOAD_SQL_PROFILE.SQL
    SQL>SET ECHO OFF;
    
    ****************************************************************************
    * Enter SYSTEM password to export staging table STGTAB_SQLPROF_329d885bxvrcr
    ****************************************************************************
    
    Export: Release 11.2.0.4.0 - Production on 星期二 12月 5 15:36:24 2017
    
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
    
    口令:
    
    coe_load_sql_profile completed.
    SQL>

    6.运行原来的SQL语句

    SQL>conn scott/tiger
    SQL> select ename from scott.emp where ename='MILLER';
    
    PLAN_TABLE_OUTPUT
    -------------------------------
    SQL_ID  329d885bxvrcr
    -------------------------------
    Plan hash value: 3956160932
    
    -------------------------------------------
    | Id  | Operation         | Name | E-Rows |
    -------------------------------------------
    |   0 | SELECT STATEMENT  |      |        |
    |*  1 |  TABLE ACCESS FULL| EMP  |      1 |
    -------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - filter("ENAME"='MILLER')
    Note
    -----
       - SQL profile 329D885BXVRCR_3956160932 used for this statement

    我们可以看到,原始的SQL现在和使用hint的sql具有相同的plan_hash_value和plan。

    此外,我们看到这个SQL启用了一个SQL配置文件。

    相关参考:
    Directing Plans with Baselines/Profiles Using coe_load_sql_baseline.sql / coe_load_sql_profile.sql (shipped with SQLT) (Doc ID 1400903.1)

  • 相关阅读:
    mysql practice
    image update to ubuntu18.04
    C++11 new feature
    bazel remote executor--- buildfarm( in docker)
    python3学习笔记13(数据结构)
    python3学习笔记12(变量作用域)
    python3学习笔记11(函数)
    jmeter 01 之beanshell preprocessor
    python3学习笔记10(迭代器和生成器)
    python3学习笔记十(循环语句)
  • 原文地址:https://www.cnblogs.com/zylong-sys/p/12015572.html
Copyright © 2020-2023  润新知