我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle Hint 学习之一

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle Hint 学习之一

  1. APPEDND hint :用于控制insert 语句是否能以直接路径插入的方式插入数据。

  2. CACHE hint:用于控制目标sql在执行时是否将全表扫描目标表的数据块放到buffer cache的LRU链表的热端。

  3. MONITER hint:用于控制被执行的目标sql是否被sql monitor监控

  4. Gather_plan_statistics hint:用于在目标sql执行时收集一些额外的统计信息:

SQL> select  t1.empno,t1.ename,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno;
     EMPNO ENAME      DNAME
---------- ---------- --------------
      7782 CLARK      ACCOUNTING
,,,,
14 rows selected.
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID4m81jub7yju91, child number 0
-------------------------------------
select  t1.empno,t1.ename,t2.dname from
emp t1,dept t2 where t1.deptno=t2.deptno
Plan hash value: 844388907
-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation     | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |      1 | |     14 |00:00:00.01 |      10 | | |    |
|   1 |  MERGE JOIN     |       |      1 |     14 |     14 |00:00:00.01 |      10 | | |    |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |      1 |      4 |4 |00:00:00.01 |       4 | | |    |
|   3 |    INDEX FULL SCAN     | PK_DEPT |      1 |      4 |4 |00:00:00.01 |       2 | | |    |
|*  4 |   SORT JOIN     |       |      4 |     14 |     14 |00:00:00.01 |       6 |  2048 |  2048 | 2048  (0)|
|   5 |    TABLE ACCESS FULL     | EMP     |      1 |     14 |     14 |00:00:00.01 |       6 | | |    |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access("T1"."DEPTNO"="T2"."DEPTNO")
       filter("T1"."DEPTNO"="T2"."DEPTNO")
24 rows selected.


不加hint,看不到上面starts类似的执行计划:

SQL> select  t1.empno,t1.ename,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno;
     EMPNO ENAME      DNAME
---------- ---------- --------------
      7782 CLARK      ACCOUNTING
      ,,,,
14 rows selected.
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID4m81jub7yju91, child number 0
-------------------------------------
select  t1.empno,t1.ename,t2.dname from
emp t1,dept t2 where t1.deptno=t2.deptno
Plan hash value: 844388907
-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation     | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |      1 | |     14 |00:00:00.01 |      10 | | |    |
|   1 |  MERGE JOIN     |       |      1 |     14 |     14 |00:00:00.01 |      10 | | |    |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |      1 |      4 |4 |00:00:00.01 |       4 | | |    |
|   3 |    INDEX FULL SCAN     | PK_DEPT |      1 |      4 |4 |00:00:00.01 |       2 | | |    |
|*  4 |   SORT JOIN     |       |      4 |     14 |     14 |00:00:00.01 |       6 |  2048 |  2048 | 2048  (0)|
|   5 |    TABLE ACCESS FULL     | EMP     |      1 |     14 |     14 |00:00:00.01 |       6 | | |    |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access("T1"."DEPTNO"="T2"."DEPTNO")
       filter("T1"."DEPTNO"="T2"."DEPTNO")
24 rows selected.
SQL> select * from scott.emp where empno=7369; --错误的写法
SQL> select * from scott.emp where empno=7369; --正确的写法
SQL> select * from scott.emp t1 where empno=7369; --HINT中指定别名,否则无效


针对query block,hint生效范围仅限于它本身所在的。

SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
SQL> select t1.ename,t1.deptno from t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO'); --该HINT对T2表不生效

HINT中出现query block其格式必须是“@query block名称”。

方法一:

SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');

方法二:

SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');

方法三:(自定义qb_name)

SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
SQL> set autot off;
SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
ENAME       DEPTNO
---------- ----------
ALLEN   30
WARD   30
MARTIN   30
BLAKE   30
TURNER   30
JAMES   30
ALLEN   30
WARD   30
24 rows selected.
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID3v4x69w2mvqgs, child number 0
-------------------------------------
select t1.ename,t1.deptno from t1 where t1.deptno in (select t2.deptno
from dept t2 where t2.loc='CHICAGO')
Plan hash value: 2392421419
---------------------------------------------------------------------------------------------
| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |    |    |    |  5 (100)|    |
|*  1 |  HASH JOIN     |    | 19 |380 |  5   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |  1 | 11 |  2   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN     | IDX_DEPT_LOC |  1 |    |  1   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL     | T1    | 56 |504 |  3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$5DA710D3
   2 - SEL$5DA710D3 / T2@SEL$2
   3 - SEL$5DA710D3 / T2@SEL$2
   4 - SEL$5DA710D3 / T1@SEL$1
Outline Data
-------------
  
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("T1"."DEPTNO"="T2"."DEPTNO")
   3 - access("T2"."LOC"='CHICAGO')
Column Projection Information (identified by operation id):
-----------------------------------------------------------
   1 - (#keys=1) "T1"."DEPTNO"[NUMBER,22], "T1"."ENAME"[VARCHAR2,10]
   2 - "T2"."DEPTNO"[NUMBER,22]
   3 - "T2".ROWID[ROWID,10]
   4 - "T1"."ENAME"[VARCHAR2,10], "T1"."DEPTNO"[NUMBER,22]
59 rows selected.

上述执行计划中:T2@SEL$2 和T1@SEL$1 query block ,而SEL$5DA710D3是一次查询转换(包含子查询展开,视图合并,连接谓词推入)而形成的新的query block。

Outline data,是用来固定执行计划的内部hint组合,非常全面的组合,比一般hint更加可靠:

在emp deptno建立索引,让sql走NL:

SQL> select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 902326130
----------------------------------------------------------------------------------------------
| Id  | Operation      | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |   5 | 100 |   3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS      |      |   5 | 100 |   3   (0)| 00:00:01 |
|   2 |   NESTED LOOPS      |      |   5 | 100 |   3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DEPT     |   1 |  11 |   2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN      | IDX_DEPT_LOC |   1 |     |   1   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN      | IDX_EMP_DEPT |   5 |     |   0   (0)| 00:00:01 |
|   6 |   TABLE ACCESS BY INDEX ROWID | EMP     |   5 |  45 |   1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access("T2"."LOC"='CHICAGO')
   5 - access("T1"."DEPTNO"="T2"."DEPTNO")
Statistics
----------------------------------------------------------
  0  recursive calls
  0  db block gets
  7  consistent gets
  0  physical reads
  0  redo size
714  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  6  rows processed

如果把hash 连接outline data加入hint,讲不会使用新建的索引,走出hash连接:

 

select t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc='CHICAGO');
6 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2711458306
---------------------------------------------------------------------------------------------
| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |    |  5 |100 |  5   (0)| 00:00:01 |
|*  1 |  HASH JOIN     |    |  5 |100 |  5   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |  1 | 11 |  2   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN     | IDX_DEPT_LOC |  1 |    |  1   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL     | EMP    | 14 |126 |  3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("T1"."DEPTNO"="T2"."DEPTNO")
   3 - access("T2"."LOC"='CHICAGO')
Statistics
----------------------------------------------------------
  1  recursive calls
  0  db block gets
  9  consistent gets
  0  physical reads
  0  redo size
714  bytes sent via SQL*Net to client
523  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  6  rows processed

所有hint由_optimizer_ignore_hints决定(system或者session级别),默认false,不忽略hint,设置成ture将会忽略掉所有的hint。

SQL> alter system set "_optimizer_ignore_hints"=true;
System altered.
SQL> select  * from emp where empno=7369;
Execution Plan
----------------------------------------------------------
Plan hash value: 2949544139
--------------------------------------------------------------------------------------
| Id  | Operation    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |     |   1 |  38 |   1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |   1 |  38 |   1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN    | PK_EMP |   1 |     |   0   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("EMPNO"=7369)
Statistics
----------------------------------------------------------
  1  recursive calls
  0  db block gets
  2  consistent gets
  0  physical reads
  0  redo size
889  bytes sent via SQL*Net to client
512  bytes received via SQL*Net from client
  1  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle Hint 学习之一

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

学习之Redis(一)

一、redis简介  一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高。https://redis.io/topics/introduction。如果像我一样,英语不好的童鞋,不要紧
学习之Redis(一)
2018-05-31

Oracle入门学习一

oracle的安装,用户授权,表格操作,数据类型,ddl表格,dml数据。下一篇:Oracle入门学习二学习视频:https://www.bilibili.com/video/BV1tJ411r7EC?p=15安装教程附带百度云安装包:https://blog
Oracle入门学习一
2018-09-30

Python学习之(一)在eclipse

纠结了好久,该不该开始学Python。最后还是追随心的选择,开始了Python的学习之旅。Python的环境搭建非常简单。第一步:下载Python的windows开发环境,并安装,我是安装到d盘根目录下。下载地址为:    http://w
2023-01-31

Python学习之认知(一)

第二章(一)2.1 python介绍2.1.1 python是一种什么样的语言​ 编程语⾔主要从以下几个⻆度为进行分类,编译型和解释型、静态语言和动态语⾔、强类型定义语言和弱类型定义语言。编译和解释的区别是什么​ 编译器是把源程序的每一条语
2023-01-31

Python学习之旅(十一)

一、全局变量和局部变量局部变量:在函数内定义的变量,在函数内使用全局变量:在函数外定义的变量,在程序任何地方都可以使用1、全局变量与局部变量同名这时函数内部只调用局部变量,如果要调用全局变量需要在函数内加一句“global 同名变量”x=1
2023-01-30

跟我一起学习pybind11 之一

pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给Python,反之亦然。主要用于将已经存在的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。利用编译时的内省来
2023-01-31

学习Oracle的历程 (一)

功能强大、性能卓越   Oracle数据库思想的诞生是在IBM公司。 上世纪60年代-70年代--IBM的一款数据库IMS,98%+ 二. Oracle 10g 安装包 链接:https://pan.baidu.com/s/1JAqXrDQsuceK0zOZ
学习Oracle的历程 (一)
2014-09-24

我的Node.js学习之路(一)

一,node.js介绍这些网上一大堆信息,我只精简1,什么是node.js 从核心上说:Node.js是个事件驱动的服务器端javascript环境,也就是说,我们可以像使用PHP,Ruby和Python语言那样,使用javascript创
2022-06-04

编程热搜

目录