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 /*+ gather_plan_statistics */ 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 /*+ gather_plan_statistics */ 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 /*+ gather_plan_statistics */ 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 /*+ gather_plan_statistics */ 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 /*+ full(scott.emp) */* from scott.emp where empno=7369; --错误的写法
SQL> select /*+ full(emp) */* from scott.emp where empno=7369; --正确的写法
SQL> select /*+ full(t1) */* from scott.emp t1 where empno=7369; --HINT中指定别名,否则无效

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

SQL> select /*+ full(t1) */t1.ename,t1.deptno from emp t1 where t1.deptno in (select /*+ full(t2) */t2.deptno from dept t2 where t2.loc=‘CHICAGO‘);
SQL> select /*+ full(t1) full(t2) */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 /*+ full(@sel$1 t1) full(@sel$2 t2) */t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from dept t2 where t2.loc=‘CHICAGO‘);

方法二:

SQL> select /*+ full([email protected]$1) full([email protected]$2) */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 /*+ full([email protected]$1) full(@llc t2) */t1.ename,t1.deptno from emp t1 where t1.deptno in (select /*+ qb_name(llc) */t2.deptno from dept t2 where t2.loc=‘CHICAGO‘);
SQL> select /*+ full([email protected]$1) full([email protected]) */t1.ename,t1.deptno from emp t1 where t1.deptno in (select /*+ qb_name(llc) */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 / [email protected]$2
   3 - SEL$5DA710D3 / [email protected]$2
   4 - SEL$5DA710D3 / [email protected]$1
Outline Data
-------------
  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
      DB_VERSION(‘11.2.0.4‘)
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$5DA710D3")
      UNNEST(@"SEL$2")
      OUTLINE(@"SEL$1")
      OUTLINE(@"SEL$2")
      INDEX_RS_ASC(@"SEL$5DA710D3" "T2"@"SEL$2" ("DEPT"."LOC"))
      FULL(@"SEL$5DA710D3" "T1"@"SEL$1")
      LEADING(@"SEL$5DA710D3" "T2"@"SEL$2" "T1"@"SEL$1")
      USE_HASH(@"SEL$5DA710D3" "T1"@"SEL$1")
      END_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.

上述执行计划中:[email protected]$2 和[email protected]$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 /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
      DB_VERSION(‘11.2.0.4‘)
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$5DA710D3")
      UNNEST(@"SEL$2")
      OUTLINE(@"SEL$1")
      OUTLINE(@"SEL$2")
      INDEX_RS_ASC(@"SEL$5DA710D3" "T2"@"SEL$2" ("DEPT"."LOC"))
      FULL(@"SEL$5DA710D3" "T1"@"SEL$1")
      LEADING(@"SEL$5DA710D3" "T2"@"SEL$2" "T1"@"SEL$1")
      USE_HASH(@"SEL$5DA710D3" "T1"@"SEL$1")
      END_OUTLINE_DATA
 16    */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 /*+ full(emp) */ * 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
时间: 2024-08-17 19:53:21

Oracle Hint 学习之一的相关文章

Oracle Hint学习之二(忽略hint的情形)

在非分区索引上使用并行hint: 如下全表扫描并行hint可以生效: SQL> select /*+ full(dept) parallel(dept 2) */deptno from dept; Execution Plan ---------------------------------------------------------- Plan hash value: 587379989 --------------------------------------------------

Oracle Hint 学习之三

与表连接顺序的相关hint: 执行顺序emp-jobs-dept SQL> select /*+ ordered */e.ename,j.job,e.sal,d.deptno from emp e,jobs j,dept d where e.empno=j.empno and e.deptno=d.deptno and d.loc='CHICAGO' order by e.ename; 6 rows selected. Execution Plan -----------------------

Oracle GoldenGate学习之--GoldenGate的监控

Oracle GoldenGate学习之--GoldenGate的监控 1.使用GGSCI命令监控 (1)进入GoldenGate安装目录,运行GGSCI,然后使用info all查看整体的运行状况 GGSCI (aix212) 1> info all Program     Status      Group       Lag at Chkpt  Time Since Chkpt MANAGER     RUNNING EXTRACT     RUNNING     EORA_1      

Oracle Rac11g 学习笔记

查看集群节点状态 命令是olsnodes -i 显示每个节点的VIP, -n 显示每个节点在RAC集群中的编号 -p 显示每个节点所使用的私有IP地址 -s 显示每个节点的状态(activive或者inactive) 列车集群中所有资源 crs_stat -t 查看crs资源状态 crsctl check crs 查看ctss服务的状态 crsctl check ctss 查看集群中所有节点状态 crsctl check cluster -all 查看ASM实例进程 ps -ef | grep

oracle 触发器 学习笔记

触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功能: 1. 允许/限制对表的修改 2. 自动生成派生列,比如自增字段 3. 强制数据一致性 4. 提供审计和日志记录 5. 防止无效的事务处理 6. 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old

Oracle Hint 用法

正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+    */ 和注释很像,比注释多了一个“+”,这就是Hint 上面这个hint的意思是让Oracle执行这个SQL时强制走索引. 如果hint的语法有错误,Oracle是不会报错,只是把/* */里的内容当做注释而已. 不合理使用Hint的危害: 由于表中的数据是会变化,一般不能在程序中的sql里用Hint,假如像上面的Hint一样强制走索引.万一某

Oracle GoldenGate学习之--基本概念和配置

Oracle GoldenGate学习之--基本概念和配置(1) 一  GoldenGate简介 Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源 数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步.Oracle Golden Gate可以在异构的IT基础结构(包括几乎 所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以 在应急系统.在线报表.实时数据仓库供应.交易跟

Oracle GoldenGate学习之--基本概念和配置(2)

Oracle GoldenGate学习之--基本概念和配置(2) 一.Oracle OGG下载: http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.html 二:OGG安装(RedHat EL6) (未完待续)

Oracle GoldenGate学习之--AIX rac系统安装配置(1)

Oracle GoldenGate学习之--AIX rac系统安装配置(1) 系统环境 操作系统:AIX5.3-09 DB Soft:  Oracle 10gR2 Cluster:   CRS 10.2.0.1 如下图所示: 本案例是用于基于VG Concurrent 的共享存储: 系统环境实在AIX系统上构建的Oracle RAC 下载OGG: http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.