`

Oracle 表连接之Hints

 
阅读更多
hash_join可以通过swap_join_inputs来强制指定build表(或者驱动表),no_swap_join_inputs来强制
指定prob表(探查表,或者说被驱动表)
配合leading或者ordered可以控制多表之前的连接顺序
----------------创建4个测试表
create table t1 as select * from dba_objects;
create table t2 as select * from dba_objects;
create table t3 as select * from dba_objects;
create table t4 as select * from dba_objects;
/*
Leading 控制表的关联顺序为T2,T3,T1,T4.先t2,t3做jion,USE_HASH指定表的连接方式,
然后结果集与T1进行关联,通过SWAP_JOIN_INPUTS来指定T1表作为(T2,T3 Hash Join结果集)关联的驱动表。
然后结果集与T4进行关联,通过NO_SWAP_JOIN_INPUTS来指定T4作为探查表(或者说被驱动表)
*/

SELECT
/*+                             
 Leading(T2,T3,T1,T4)
 USE_HASH(T3)                    
 USE_HASH(T1)                    
 SWAP_JOIN_INPUTS(T1)            
 USE_HASH(T4)                    
 NO_SWAP_JOIN_INPUTS(T4)         
 */
 *
  FROM T1,T2,T3,T4
 WHERE T1.OBJECT_ID = T2.OBJECT_ID
   AND T2.OBJECT_NAME = T3.OBJECT_NAME
   AND T3.OWNER = T4.OWNER
   AND T4.OWNER = 'MYDB';
执行计划
----------------------------------------------------------
Plan hash value: 3177457315

-------------------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |  2284 |  1846K|       |  1616   (1)| 00:00:20 |
|*  1 |  HASH JOIN           |      |  2284 |  1846K|       |  1616   (1)| 00:00:20 |
|*  2 |   HASH JOIN          |      |   299 |   181K|  7656K|  1424   (1)| 00:00:18 |
|   3 |    TABLE ACCESS FULL | T1   | 35780 |  7232K|       |   192   (2)| 00:00:03 |
|*  4 |    HASH JOIN         |      |   375 |   151K|  9584K|   851   (1)| 00:00:11 |
|   5 |     TABLE ACCESS FULL| T2   | 44802 |  9056K|       |   193   (2)| 00:00:03 |
|*  6 |     TABLE ACCESS FULL| T3   |     8 |  1656 |       |   191   (1)| 00:00:03 |
|*  7 |   TABLE ACCESS FULL  | T4   |     8 |  1656 |       |   192   (2)| 00:00:03 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("T3"."OWNER"="T4"."OWNER")
   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   4 - access("T2"."OBJECT_NAME"="T3"."OBJECT_NAME")
   6 - filter("T3"."OWNER"='MYDB')
   7 - filter("T4"."OWNER"='MYDB')

 

分享到:
评论

相关推荐

    oracle hints详细介绍

    3. **复杂查询优化**:对于那些包含多个表连接、子查询等复杂结构的SQL语句,使用Hints可以帮助优化器更好地理解用户的意图。 #### 三、Hints 的类型 根据功能的不同,Hints大致可以分为以下几类: 1. **表访问...

    oracle HINTS用法

    ### Oracle Hints用法详解 Oracle Hints是Oracle数据库中一种非常实用的功能,它允许用户在SQL语句中提供优化器提示,以便更好地控制查询执行计划。这些提示可以帮助数据库优化器选择更有效的路径来执行查询,从而...

    oracle sql 语句暗示 hints

    Oracle SQL 作为业界广泛使用的数据库查询语言之一,在这一过程中扮演着关键角色。为了提升SQL语句的执行效率,Oracle 提供了一系列称为“暗示”(Hints)的功能。本文将深入探讨 Oracle SQL 语句暗示的相关知识点,...

    Oracle的hints调整机制介绍

    Oracle的Hints调整机制是数据库管理员和开发人员用来指导Oracle Cost-Based Optimizer(CBO)做出更符合预期执行计划的一种方式。Hints是一种在SQL查询中插入的特殊注释,用于告诉Oracle如何优化查询路径,以提高...

    Oracle中表的连接及其调整.

    Oracle 查询优化器会自动选择最适合的连接方法,但有时手动调整连接顺序或使用 hints 可以进一步优化性能。例如,在外连接查询中,驱动表通常选择那些需要返回所有记录的表,即使它们可能包含更多的数据。 总结来说...

    oracle-hints.rar_oracle

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。"Oracle Hints"是Oracle数据库系统中的一个重要特性,它允许SQL查询优化器根据开发人员提供的指导(即Hints)来选择执行计划...

    解析Oracle Hints.

    2. **连接类型Hints**:这类Hints用于控制多表之间的连接方式,如`NESTED LOOP`(嵌套循环连接)、`HASH JOIN`(哈希连接)、`MERGE JOIN`(合并连接)等。 - 示例:`SELECT /* +NESTED LOOPS */ ...` 3. **其他...

    Oracle数据库表连接笔记.doc

    Oracle数据库中的表连接是数据库查询中的核心操作,它允许从多个表中合并数据,以满足复杂的业务需求。Oracle数据库提供了多种连接方法,包括嵌套循环连接、排序合并连接、集群连接、笛卡尔连接和散列连接,以及特定...

    Hints优化.pdf

    Oracle Hints在处理复杂SQL语句或特定类型的数据库操作时尤其有用,比如多表连接、子查询、排序、索引使用等。使用Hints可以为Oracle优化器提供更具体的执行计划,从而优化数据库性能。 Oracle 9i是一个广泛使用的...

    oracle_hints

    3. **类型**:Oracle支持多种类型的hints,包括索引使用(INDEX, USE_INDEX, IGNORE_INDEX),连接顺序(LEADING, ORDERED, NESTED LOOP),并行处理(PARALLEL),分区策略(PARTITION)等。 **Sql优化之Hints的...

    Oracle SQL Hints

    Oracle SQL Hints是一种在Oracle数据库中用于优化SQL语句执行计划的辅助手段。通过在SQL语句中嵌入特定的指令,即HINT,可以向Oracle优化器强制指示使用特定的访问路径、关联方法等,以便绕过优化器的默认选择,从而...

    Oracle内部培训汇总

    例如,通过避免全表扫描、减少表连接、利用索引覆盖、优化连接顺序等方式,可以显著提高查询效率。 在实际工作中,理解这些概念并熟练运用是提升数据库性能的基础。存储过程和触发器是Oracle中的高级特性,它们允许...

    Oracle的执行计划

    嵌套循环连接是最简单的连接方法之一,它依次处理第一个表的每一行,并针对每行在第二个表中查找匹配的行。这种连接方式适合于小表与大表的连接。 #### 九、如何产生执行计划 执行计划是由Oracle的优化器根据SQL...

    Oracle 执行计划PPT

    Oracle在处理多表连接时,会先连接两表,然后将结果与下一个表连接。连接方法有多种,包括: 1. **嵌套循环连接**(Nested Loop Join):每一行从一个表中与另一个表的所有行进行比较。 2. **哈希连接**(Hash Join...

    oracle学习日志总结

    Oracle数据库是世界上最流行的数据库管理系统之一,它在企业级应用中占据着重要的地位。本文将对“Oracle学习日志总结”中的关键知识点进行深入探讨,帮助读者理解和优化Oracle数据库的使用。 1. **共享SQL和参数化...

    【oracle】oracle查询优化改写

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其性能优化是DBA(数据库管理员)和开发人员的关键技能之一。查询优化是性能优化的核心部分,它涉及到如何以最有效的方式执行SQL查询,从而提高数据检索的...

Global site tag (gtag.js) - Google Analytics