ITPub博客

首页 > 数据库 > Oracle > [20220329]19c sql语句打补丁.txt

[20220329]19c sql语句打补丁.txt

原创 Oracle 作者:lfree 时间:2022-03-29 16:37:08 0 删除 编辑

[20220329]19c sql语句打补丁.txt

--//在19c优化sql语句使用sql profile模式交换执行计划时,出现无法稳定执行计划的情况。
--//尝试打补丁的方式,19c以上版本与以前11g的命令有一点点不同,做一个简单记录。

1.环境:
> @pr
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 19.0.0.0.0
BANNER                        : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0
BANNER_LEGACY                 : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

1.打补丁:
--//首先确定sql_id,执行如下命令:
DECLARE
   v_sql        CLOB;
   patch_name   VARCHAR2 (100);
BEGIN
   SELECT SQL_FULLTEXT
     INTO v_sql
     FROM v$sql
    WHERE sql_id = '&sql_id' AND ROWNUM = 1;

   patch_name :=
      sys.DBMS_SQLDIAG.create_sql_patch
      (
         sql_text    => v_sql
        ,hint_text   => 'USE_CONCAT(@"SEL$2BFA4EE4" 8 OR_PREDICATES(5)))'
        ,name        => 'user_extents_patch &sql_id'
      );
END;
/

--//说明:我以前写的脚本使用SQL_TEXT,实际上其类型VARCHAR2(1000),不是clob,做测试可以,生产系统语句一般都很长不行。
--//以前11g使用sys.dbms_sqldiag_internal.i_create_patch,这个是一个存储过程,调用就ok了,无法定义变量patch_name。

YS@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SYS@book> @ desc sys.dbms_sqldiag_internal
PROCEDURE I_CREATE_HINTSET
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_TEXT                       CLOB                    IN
 HINT_TEXT                      VARCHAR2                IN
 NAME                           VARCHAR2                IN     DEFAULT
 DESCRIPTION                    VARCHAR2                IN     DEFAULT
 CATEGORY                       VARCHAR2                IN     DEFAULT
 VALIDATE                       BOOLEAN                 IN     DEFAULT
PROCEDURE I_CREATE_PATCH
~~~~~~~~~~~~~~~~~~~~~~~~
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_TEXT                       CLOB                    IN
 HINT_TEXT                      VARCHAR2                IN
 NAME                           VARCHAR2                IN     DEFAULT
 DESCRIPTION                    VARCHAR2                IN     DEFAULT
 CATEGORY                       VARCHAR2                IN     DEFAULT
 VALIDATE                       BOOLEAN                 IN     DEFAULT
FUNCTION I_GENERATE_SS_IMPORT RETURNS VARCHAR2
FUNCTION I_GET_DBVERSION RETURNS VARCHAR2
FUNCTION I_GET_INCIDENTID RETURNS NUMBER
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ID                             VARCHAR2                IN
PROCEDURE I_INCIDENTID_2_SQL
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 INCIDENT_ID                    VARCHAR2                IN
 SQL_STMT                       SQLSET_ROW              OUT
 PROBLEM_TYPE                   NUMBER                  OUT
 ERR_CODE                       BINARY_INTEGER          OUT
 ERR_MESG                       VARCHAR2                OUT

--//而19c使用sys.dbms_sqldiag包,CREATE_SQL_PATCH是一个函数,需要一个变量接收返回。
> @ desc sys.dbms_sqldiag
...
FUNCTION CREATE_SQL_PATCH RETURNS VARCHAR2
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQL_ID                         VARCHAR2                IN
 HINT_TEXT                      CLOB                    IN
 NAME                           VARCHAR2                IN     DEFAULT
 DESCRIPTION                    VARCHAR2                IN     DEFAULT
 CATEGORY                       VARCHAR2                IN     DEFAULT
 VALIDATE                       BOOLEAN                 IN     DEFAULT


2.查看打补丁信息:
$ cat spext.sql
/* Formatted on 2015/4/10 17:03:49 (QP5 v5.252.13127.32867) */
column hint format a200
column name format a30
SELECT EXTRACTVALUE (VALUE (h), '.') AS hint,so.name
  FROM SYS.sqlobj$data od
      ,SYS.sqlobj$ so
      ,TABLE
       (
          XMLSEQUENCE
          (
             EXTRACT (XMLTYPE (od.comp_data), '/outline_data/hint')
          )
       ) h
 WHERE    ( so.NAME in ( 'profile &&1', 'tuning &&1','switch tuning &&1') or lower(so.name) like lower('%&&1%'))
       AND so.signature = od.signature
       AND so.CATEGORY = od.CATEGORY
       AND so.obj_type = od.obj_type
       AND so.plan_id = od.plan_id;


> @ spext gk5ttf0jpf88k
HINT                                             NAME
------------------------------------------------ ------------------------------
USE_CONCAT(@"SEL$2BFA4EE4" 8 OR_PREDICATES(5)))  user_extents_patch gk5ttf0jpf88k

3.删除sql补丁执行如下:
exec sys.dbms_sqldiag.drop_sql_patch('user_extents_patch &sql_id');

4.检查是否生效:
@ dpc gk5ttf0jpf88k outline ''

--//始终搞不明白为什么sql profile交换执行计划不行。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2884795/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969544