ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表。
use_nl(t1,t2):表示对表t1、t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁是被驱动的表。
USE_NL(),先看看oracle doc怎么说:
In this statement, the USE_NL hint explicitly chooses a nested loops join with the customers table as the inner table:
SELECT /*+ ORDERED USE_NL(customers) to get first row faster */ accounts.balance, customers.last_name, customers.first_name FROM accounts, customers WHERE accounts.customer_id = customers.customer_id;
customers 作为inner table,也就是说作为被驱动表。驱动表称为outer table。
如果指定的表是outer table(驱动表),则优化器会忽略这个hint。
如果非要强制它作为inner table,可以配上ordered参数。
oradered 表示根据from 后面表的顺序,从左到右join,左表做驱动表,3个或3个以上最有用。
也就是说use_nl如果只带了一个表名作为参数,则该表为被驱动表。
如果带了2个以上的参数,Oracle并没有指出use_nl(a,b)中哪个是驱动表,所以常使用ordered或者full()或者index()来强化我们的目标。
以下是测试:
hr@ORCL> select first_name,departments.department_id from employees,departments where employees.department_id=departments.department_id; Execution Plan ---------------------------------------------------------- Plan hash value: 169719308 --------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 106 | 1484 | 3 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 106 | 1484 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMPLOYEES | 107 | 1070 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| DEPT_ID_PK | 1 | 4 | 0 (0)| 00:00:01 | ---------------------------------------------------------------------------------
此处优化器选择employees作为驱动表,因为departments上有索引,而且索引正好建立在连接列上。
hr@ORCL> select /*+ use_nl(employees) */ first_name,departments.department_id from employees,departments where employees.department_id=departments.department_id; Execution Plan ---------------------------------------------------------- Plan hash value: 169719308 --------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 106 | 1484 | 3 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 106 | 1484 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMPLOYEES | 107 | 1070 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| DEPT_ID_PK | 1 | 4 | 0 (0)| 00:00:01 | ---------------------------------------------------------------------------------
由于employees是作为驱动表,优化器会忽略hint提示。
hr@ORCL> select /*+ ordered use_nl(employees) */ first_name,departments.department_id from departments,employees where employees.department_id=departments.department_id; Execution Plan ---------------------------------------------------------- Plan hash value: 2677871237 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 106 | 1484 | 8 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 4 | 40 | 1 (0)| 00:00:01 | | 2 | NESTED LOOPS | | 106 | 1484 | 8 (0)| 00:00:01 | | 3 | INDEX FULL SCAN | DEPT_ID_PK | 27 | 108 | 1 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------
现在是departments作为驱动表了。
相关推荐
介绍了oracle中的hint,常用的 ordered、use_nl、use_hash、index、full 五种, 给出使用实例和适用场景
在IT行业中,数据库性能优化是确保系统高效运行的关键环节,特别是在大型企业级应用中,如黑龙江移动通信...通过对这些知识点的深入理解和实践,可以有效提升数据库性能,满足企业级应用的高并发、大数据量处理需求。
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
use_nl hint指示查询优化器使用nested loops方式连接指定表和其他行源,并且将强制指定表作为inner表。 在mysql中就有之对应的straight_join,由于mysql只支持nested loops的连接方式,所以这里的straight_join类似...
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
Oracle Hint 是一种在SQL语句中插入的特殊指令,它用来指导Oracle数据库的查询优化器如何执行查询。在SQL优化过程中,Hint可以帮助我们控制查询执行计划,以达到提高查询性能的目的。以下是一些常见的Oracle Hint...
Oracle的Cost-Based Optimizer (CBO) 是一种自动选择最优执行计划的机制,它通过评估不同执行路径的成本来决定...然而,由于CBO的复杂性,深入理解和实践是至关重要的。务必在生产环境中谨慎应用,以防止可能的反效果。
例如,通过在查询中使用"/*+ ordered use_nl(bonus) parallel(e, 4) */"这样的提示,可以指示优化器按照特定的顺序执行连接,并使用嵌套循环(nested loop)和并行执行(parallel)等策略。 总结来说,理解Oracle的...
可以用ordered提示来改变CBO默认的驱动表,或者用USE_NL(table_name1 table_name2)提示来强制使用nested loop。 HASH JOIN HASH JOIN是CBO做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键...
例如,在SQL语句中添加`/*+ ordered use_nl(bonus) parallel(e,4) */`这样的Hint,可以明确指定使用嵌套循环连接(Nested Loop Join)的方式,并行执行特定的子查询,从而在某些场景下进一步提升查询效率。...
本文将深入探讨 Oracle SQL 语句暗示的相关知识点,帮助开发人员更好地理解和运用这些强大工具。 #### 二、Oracle SQL 暗示概述 **Oracle SQL 暗示** 是一种特殊语法,用于向数据库优化器提供有关如何处理特定 SQL...
SELECT /*+ ORDERED USE_NL(BSEMPMS) */ BSDPTMS.DPT_NO, BSEMPMS.EMP_NO, BSEMPMS.EMP_NAM FROM BSEMPMS, BSDPTMS WHERE BSEMPMS.DPT_NO = BSDPTMS.DPT_NO; ``` ##### /*+USE_MERGE(TABLE)*/ - **含义**:此...
例如,在Listing A所示的查询中,`ordered`提示与`use_nl(bonus)`一起使用,确保`bonus`表先于`emp`表进行合并。同时,`parallel(e, 4)`提示还启用了对`emp`表的并行查询,进一步提高了执行速度。 其次,`ordered_...
在实验中,文章提到了使用Oracle提供的查询提示(hint),如“ordered use_nl”,这些是Oracle查询优化器的指令,用以控制SQL语句的执行计划。合理使用这些提示,可以帮助调整和优化查询执行过程,特别是在复杂的...