广告
返回顶部
首页 > 资讯 > 数据库 >Oracle Hint 学习之一
  • 574
分享到

Oracle Hint 学习之一

2024-04-02 19:04:59 574人浏览 安东尼
摘要

APPEDND hint :用于控制insert 语句是否能以直接路径插入的方式插入数据。CACHE hint:用于控制目标sql在执行时是否将全表扫描目标表的数据块放到buffer cache的LRU链表

  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


您可能感兴趣的文档:

--结束END--

本文标题: Oracle Hint 学习之一

本文链接: https://www.lsjlt.com/news/39046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Oracle Hint 学习之一
    APPEDND hint :用于控制insert 语句是否能以直接路径插入的方式插入数据。CACHE hint:用于控制目标sql在执行时是否将全表扫描目标表的数据块放到buffer cache的LRU链表...
    99+
    2022-10-18
  • Oracle Hint 学习之三
    与表连接顺序的相关hint:执行顺序emp-jobs-deptSQL> select e.ename,j.job,e.sal,d.deptno from&nbs...
    99+
    2022-10-18
  • Oracle Hint学习之二(忽略hint的情形)
    在非分区索引上使用并行hint:如下全表扫描并行hint可以生效:SQL> select deptno from dept; Execution&nb...
    99+
    2022-10-18
  • Oracle 学习之性能优化(九)使用hint
            基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行...
    99+
    2022-10-18
  • Oracle学习之DATAGUARD(一) DG架构
        DataGuard运行原理非常简单:传输日志、应用日志。下图表示了DG的基本架构日志传输服务将主库产生的日志数据传到从库。应用服务(Apply Service)验证日志...
    99+
    2022-10-18
  • Oracle学习之DATAGUARD(十一) snapshot database
       Snapshot Standby,此功能可将备库置身于"可读写状态"用于不方便在生产环境主库中测试的内容,比如模拟上线测试等任务。当备库读写状态下任务完成后,可以非常轻松的完成S...
    99+
    2022-10-18
  • 学习之Redis(一)
    一、redis简介   一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高。https://redis.io/topics/introduction。如果像我一样,...
    99+
    2018-05-31
    学习之Redis(一)
  • Oracle中常见的Hint(一)
    Oracle中的Hint可以用来调整SQL的执行计划,提高SQL执行效率。下面分类介绍Oracle数据库中常见的Hint。这里描述的是Oracle11gR2中的常见Hint,Oracle数据库中各个版本中的...
    99+
    2022-10-18
  • Oracle 学习之卸载Oracle 11g
      Oracle 11g 安装完毕后,如果有卸载的需要。可以有如下方法:手工删除Oracle安装时建立的各目录、文件等。这种方法对于Linux还算可行,但是Window版中涉及到服务、注册表等等。...
    99+
    2022-10-18
  • Oracle入门学习一
    oracle的安装,用户授权,表格操作,数据类型,ddl表格,dml数据。 下一篇:Oracle入门学习二 学习视频:https://www.bilibili.com/video/BV1tJ411r7ECp=15 安装教程附带...
    99+
    2018-09-30
    Oracle入门学习一
  • Oracle Study学习之--Flashback Archive
    Oracle Study学习之--Flashback ArchiveCREATE FLASHBACK ARCHIVEPurpose       Use the&nbs...
    99+
    2022-10-18
  • Oracle 学习之SQL(一) Retrieving Data Using the SQL SELECT statement
    SELECT能干什么?Projection:查询表中指定列。Selection:查询表中指定行。Join:表与表之间做连接,要查看的数据放在多张表中,并且表与表之间的数据有关系。SELECT 语句的...
    99+
    2022-10-18
  • Python学习之认知(一)
    第二章(一) 2.1 python介绍 2.1.1 python是一种什么样的语言 ​ 编程语⾔主要从以下几个⻆度为进行分类,编译型和解释型、静态语言和动态语⾔、强类型定义语言和弱类型定义语言。 编译和解释的区别是什么 ​ 编译器是把源程...
    99+
    2023-01-31
    认知 Python
  • Python学习之(一)在eclipse
     纠结了好久,该不该开始学Python。最后还是追随心的选择,开始了Python的学习之旅。 Python的环境搭建非常简单。 第一步:下载Python的windows开发环境,并安装,我是安装到d盘根目录下。下载地址为:     http...
    99+
    2023-01-31
    Python eclipse
  • Python学习之旅(十一)
    一、全局变量和局部变量 局部变量:在函数内定义的变量,在函数内使用 全局变量:在函数外定义的变量,在程序任何地方都可以使用 1、全局变量与局部变量同名 这时函数内部只调用局部变量,如果要调用全局变量需要在函数内加一句“global 同名...
    99+
    2023-01-30
    之旅 Python
  • 学习Oracle的历程 (一)
    功能强大、性能卓越   Oracle数据库思想的诞生是在IBM公司。 上世纪60年代-70年代--IBM的一款数据库IMS,98%+ 二. Oracle 10g 安装包 链接:https://pan.baidu.com/s...
    99+
    2014-09-24
    学习Oracle的历程 (一)
  • 跟我一起学习pybind11 之一
    pybind11是一个轻量级的“Header-only”的库,它将C++的类型暴露给Python,反之亦然。主要用于将已经存在的C++代码绑定到Python。pybind11的目标和语法都类似于boost.python库。利用编译时的内...
    99+
    2023-01-31
    跟我一起
  • Oracle 学习之 11g Clone 安装
      如果你需要安装的数据库服务器比较多,使用图形化方式安装数据库软件的速度还是很慢,而且也比较麻烦。Oracle 11g 提供了Clone安装的方法。步骤如下:使用正常方法在服务器A上安装好Ora...
    99+
    2022-10-18
  • Oracle 学习之性能优化(一)SQL语句处理
      当向Oracle提交一个sql命令时,Oracle到底做了哪些事情?对这个问题有很好的理解,能帮助你更好的分析sql语句的优化。  执行一条sql语句从开始到结束,需要经历4个步骤:...
    99+
    2022-10-18
  • Oracle 学习之性能优化(十一)物化视图
      物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。在数据仓库中,还经常使用查询重写(query rewri...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作