[20181007]12cR2 Using SQL Patch.txt

--//12cR2 已经把sql打补丁集成进入dbms_sqldiag,不是11g的 DBMS_SQLDIAG_INTERNAL.I_CREATE_PATCH .做一个记录.
--//以前的链接:http://blog.itpub.net/267265/viewspace-751900/=>[20121231]给sql打补丁.txt

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

SCOTT@test01p> @ desc_proc sys dbms_sqldiag create_sql_patch
INPUT OWNER PACKAGE_NAME OBJECT_NAME
sample : @desc_proc sys dbms_stats gather_%_stats

OWNER      PACKAGE_NAME         OBJECT_NAME      SEQUENCE ARGUMENT_NAME        DATA_TYPE            IN_OUT    DATA_TYPE            DEFAULTED
---------- -------------------- ---------------- -------- -------------------- -------------------- --------- -------------------- ----------
SYS        DBMS_SQLDIAG         CREATE_SQL_PATCH        1                      VARCHAR2             OUT       VARCHAR2             N
                                                        2 SQL_ID               VARCHAR2             IN        VARCHAR2             N
                                                        3 HINT_TEXT            CLOB                 IN        CLOB                 N
                                                        4 NAME                 VARCHAR2             IN        VARCHAR2             Y
                                                        5 DESCRIPTION          VARCHAR2             IN        VARCHAR2             Y
                                                        6 CATEGORY             VARCHAR2             IN        VARCHAR2             Y
                                                        7 VALIDATE             PL/SQL BOOLEAN       IN        PL/SQL BOOLEAN       Y
                                                        1                      VARCHAR2             OUT       VARCHAR2             N
                                                        2 SQL_TEXT             CLOB                 IN        CLOB                 N
                                                        3 HINT_TEXT            CLOB                 IN        CLOB                 N
                                                        4 NAME                 VARCHAR2             IN        VARCHAR2             Y
                                                        5 DESCRIPTION          VARCHAR2             IN        VARCHAR2             Y
                                                        6 CATEGORY             VARCHAR2             IN        VARCHAR2             Y
                                                        7 VALIDATE             PL/SQL BOOLEAN       IN        PL/SQL BOOLEAN       Y

14 rows selected.

2.测试:
SCOTT@test01p> select /*+ full(dept) */ * from dept where deptno=10;
           DEPTNO DNAME                LOC
----------------- -------------------- -------------
               10 ACCOUNTING           NEW YORK
SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  g0qybdz1796cn, child number 0
-------------------------------------
select /*+ full(dept) */ * from dept where deptno=10
Plan hash value: 3383998547
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| DEPT |      1 |    20 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / DEPT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("DEPTNO"=10)

--//sql_id=g0qybdz1796cn,实际上走索引更佳.注意多执行几次保留在共享池.
SCOTT@test01p> variable patch_name varchar2(2000);
SCOTT@test01p> exec :patch_name := dbms_sqldiag.create_sql_patch(sql_id=>'g0qybdz1796cn',hint_text=>'index(dept pk_dept)');
PL/SQL procedure successfully completed.

--//现在居然scott用户就可以执行,我记忆里以前不行,必须sys用户执行.
SCOTT@test01p> print :patch_name
PATCH_NAME
------------------------------------------
SYS_SQLPTCH_01664e9a59810003

--//相关信息记录在视图DBA_SQL_PATCHES.
SCOTT@test01p> select NAME c30,SQL_TEXT from DBA_SQL_PATCHES;
C30                            SQL_TEXT
------------------------------ ------------------------------------------------------------
SYS_SQLPTCH_01664e9a59810003   select /*+ full(dept) */ * from dept where deptno=10

SCOTT@test01p> select /*+ full(dept) */ * from dept where deptno=10;
           DEPTNO DNAME                LOC
----------------- -------------------- -------------
               10 ACCOUNTING           NEW YORK

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  g0qybdz1796cn, child number 0
-------------------------------------
select /*+ full(dept) */ * from dept where deptno=10
Plan hash value: 3383998547
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |     3 (100)|          |
|*  1 |  TABLE ACCESS FULL| DEPT |      1 |    20 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / DEPT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("DEPTNO"=10)
Note
-----
   - SQL patch "SYS_SQLPTCH_01664e9a59810003" used for this statement

--//没有起作用.实际上不能使用这样的提示.执行如下:
select * from dept where deptno=10;

--//再看执行计划提示:
SCOTT@test01p> @ dpc '' outline
...
Outline Data
-------------
  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('12.2.0.1')
      DB_VERSION('12.2.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX_RS_ASC(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))
      END_OUTLINE_DATA
  */

--//使用提示INDEX_RS_ASC(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO")).才行.

SCOTT@test01p> exec  dbms_sqldiag.drop_sql_patch(name=>'SYS_SQLPTCH_01664e9a59810003');
PL/SQL procedure successfully completed.

SCOTT@test01p> exec :patch_name := dbms_sqldiag.create_sql_patch(sql_id=>'g0qybdz1796cn',hint_text=>'INDEX_RS_ASC(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))');
PL/SQL procedure successfully completed.

SCOTT@test01p> print :patch_name
PATCH_NAME
------------------------------------
SYS_SQLPTCH_01664ea1bc190004

SCOTT@test01p> select /*+ full(dept) */ * from dept where deptno=10;
           DEPTNO DNAME                LOC
----------------- -------------------- -------------
               10 ACCOUNTING           NEW YORK

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  g0qybdz1796cn, child number 0
-------------------------------------
select /*+ full(dept) */ * from dept where deptno=10

Plan hash value: 2852011669

----------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |        |       |     1 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| DEPT    |      1 |    20 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_DEPT |      1 |       |     0   (0)|          |
----------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / DEPT@SEL$1
   2 - SEL$1 / DEPT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("DEPTNO"=10)
Note
-----
   - SQL patch "SYS_SQLPTCH_01664ea1bc190004" used for this statement
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level

--//OK,现在起作用了.

3.我个人认为sql打补丁最佳方式是加BIND_AWARE或者result_cache提示,其它情况我很少使用.
--//我记忆里11g下不能加result_cache,再加这个提示看看.

SCOTT@test01p> exec  dbms_sqldiag.drop_sql_patch(name=>'SYS_SQLPTCH_01664ea1bc190004');
PL/SQL procedure successfully completed.

SCOTT@test01p> exec :patch_name := dbms_sqldiag.create_sql_patch(sql_id=>'g0qybdz1796cn',hint_text=>'result_cache INDEX_RS_ASC(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))');
PL/SQL procedure successfully completed.

SCOTT@test01p> Select /*+ full(dept) */ * from dept where deptno=10;
           DEPTNO DNAME                LOC
----------------- -------------------- -------------
               10 ACCOUNTING           NEW YORK
--//我修改select=>Select.
SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  4sg4rbwu9r59q, child number 0
-------------------------------------
Select /*+ full(dept) */ * from dept where deptno=10
Plan hash value: 2852011669
------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                       | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                            |        |       |     1 (100)|          |
|   1 |  RESULT CACHE                | 364dg0urjj61xc7was3s7u5hcj |        |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT                       |      1 |    20 |     1   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN         | PK_DEPT                    |      1 |       |     0   (0)|          |
------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / DEPT@SEL$1
   3 - SEL$1 / DEPT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("DEPTNO"=10)
Result Cache Information (identified by operation id):
------------------------------------------------------
   1 -

Note
-----
   - SQL patch "SYS_SQLPTCH_01664eab2c7a0006" used for this statement
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level

--//OK,12c已经修复这个问题.

4.自己还有1个疑问,如何看到以前的提示:
SCOTT@test01p> select text_vc c100 from dba_views where view_name='DBA_SQL_PATCHES';
C100
----------------------------------------------------------------------------------------------------
SELECT
    so.name, so.category, so.signature, st.sql_text,
    ad.created, ad.last_modified, ad.description,
    DECODE(BITAND(so.flags, 1), 1, 'ENABLED', 'DISABLED'),
    DECODE(BITAND(sq.flags, 1), 1, 'YES', 'NO'),
    ad.task_id, ad.task_exec_name, ad.task_obj_id, ad.task_fnd_id,
    ad.task_rec_id
FROM
    sqlobj$        so,
    sqlobj$auxdata ad,
    sql$text       st,
    sql$           sq
WHERE
    so.signature = st.signature AND
    so.signature = ad.signature AND
    so.category  = ad.category  AND
    so.signature = sq.signature AND
    so.obj_type = 3 AND
    ad.obj_type = 3

--//这几个表都没有查询到提示信息,另外写一篇文章分析看看.

[20181007]12cR2 Using SQL Patch.txt的更多相关文章

  1. [20181007]12cR2 Using SQL Patch 2.txt

    [20181007]12cR2 Using SQL Patch 2.txt --//12cR2 已经把sql打补丁集成进入dbms_sqldiag,不是11g的 DBMS_SQLDIAG_INTERN ...

  2. SQL导入txt以及SQL中的时间格式操作

    原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表 ...

  3. mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................

    mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...

  4. [转帖]Oracle 12cR2使用经验

    大规模升级来临,谈谈Oracle 12cR2使用经验 随着2019年2月13日,Oracle 19c (Oracle 12.2.0.3) for Exadata 版本发布,Oracle 12cR2体系 ...

  5. [20181109]12cR2 的pre_page_sga参数

    [20181109]12cR2 的pre_page_sga参数.txt --//12CR2改变了参数pre_page_sga设置为True.设置为true有好处也有缺点.--//先看看官方的定义:ht ...

  6. oracle自动执行一个sql文件的脚本

    如图 文件夹 打开文件夹,如图 autoExeSyn-local.bat文件里的内容如下 @echo off -----------用户/密码-实例-------------执行的sql文件---&g ...

  7. .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus)

    1.数据库管理工具概述 2.SQL Plus 实用命令参考 2.1.连接/断开命令 2.2.执行 SQL 语句 2.3.执行 PL/SQL 语句 2.4.文件操作命令 2.5.修改用户密码 2.6.执 ...

  8. golang sql database drivers

    https://github.com/golang/go/wiki/SQLDrivers SQL database drivers The database/sql and database/sql/ ...

  9. 黑马程序员_超全面的JavaWeb视频教程vedio--.ppt,.pptx,.doc,.txt,.docx列表

    \JavaWeb视频教程_day1-资料源码\day01-html目录.txt;\JavaWeb视频教程_day1-资料源码\PPT\HTML.ppt;\JavaWeb视频教程_day1-资料源码\资 ...

随机推荐

  1. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  2. Apache-Flink深度解析-State

    摘要: 实际问题 在流计算场景中,数据会源源不断的流入Apache Flink系统,每条数据进入Apache Flink系统都会触发计算.如果我们想进行一个Count聚合计算,那么每次触发计算是将历史 ...

  3. 01 Windows安装Tensorflow

    1.安装Python. 点击此处下载Python3.5.2.安装Python时一定要选择安装pip. 2.配置Python环境变量. 将%安装路径%\Scripts添加到Path下面. 3.修改Pip ...

  4. thinkphp自动填充分析

    thinkphp有一个自动填充字段的方法填充规则如下 array( array(完成字段1,完成规则,[完成条件,附加规则]), array(完成字段2,完成规则,[完成条件,附加规则]), .... ...

  5. Angular2入门:TypeScript的类 - 参数属性:定义和初始化类成员

  6. (void) (&_x == &_y)的作用

    如果有下面这段代码: #define min(x, y) ({ \ const typeof(x) _x = (x); \ const typeof(y) _y = (y); \ (void) (&a ...

  7. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  8. Idea 常用功能汇总,工作中常用技巧,移出请说明原因,笔记花了好长时间汇总的

    1.隐藏没用到的文件 比如 IDEA 的项目配置文件(.iml 和.idea),打开 Settings-File Types, 加入要隐藏的文件后缀.  2.常用技巧 2.1 通过Alt+F8查看变量 ...

  9. c#连接oracle数据库 DBHelper

    闲着没事自己写了一个OracleHelper类,希望大神给点建议优化 using System; using System.Collections.Generic; using System.Linq ...

  10. collect_list/collect_set(列转行)

    Hive中collect相关的函数有collect_list和collect_set. 它们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重. 做 ...