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 usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园相关推荐

  1. oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)

    理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...

  2. oracle表加引号,oracle 表名 双引号 删除 | 学步园

    oracle10g中,建表的时候没注意,用别人发给我的sql直接创建的,创建之后发现 select  *  from 表名 ;提示表或视图不存在后来仔细查看发现是在create的时候,表名和字段名都被 ...

  3. Oracle数据库中的方案,学习Oracle数据库_理解Oracle数据库中的方案

    理解数据库.表空间.数据文件之间的关系. 每个表空间由一个或多个数据文件组成.数据文件用于在物理上存储表空间中所有逻辑结构的数据.表空间中数据文件的大小之和就是表空间的存储容量(图中系统表空间存储容量 ...

  4. oracle中@,深入理解Oracle中的DBCA

    但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...

  5. oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁

    oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这 ...

  6. 怎么全量备份oracle数据库,Oracle 数据库全量备份恢复和部分备份恢复 | 学步园...

    今天又遇到了Oracle数据库序列的问题,索性来个全库的备份和恢复.如下 imp/exp 方式 表模式备份: ­ oracle@sencloudServer: exp dhoffice/dhoffic ...

  7. servlet文件上传blob_servlet实现从oracle数据库的blob字段中读出文件并显示 | 学步园...

    /* * ReadFile.java * * Created on 2004年11月17日, 下午3:41 */ package jgwl.app; import java.io.*; import ...

  8. oracle 比对时分秒,关于Oracle数据库不带日期中时分秒的查询 | 学步园

    关于Oralce数据库 的日期时间查询: 下面我们先来看一组日期数据 表:myDate 列:time; 1998-8-7 23:45:33.3 1998-8-7 11:22:21.5 1998-8-7 ...

  9. date oracle 显示毫秒_oracle数据库to_date日期格式化到毫秒 | 学步园

    事由:一个数据导入功能,其通过视图表里一条数据的时间字段作为判断是否已导入的标识. 每次记录最后导入的一条数据的时间字段,下一次判断则导入上一次记录下的时间字段值以后的数据. 失败经验:网上看到有网友 ...

最新文章

  1. php仿tp5实现模型,php手记之05-tp5模型操作数据库
  2. jvm性能调优实战 - 42JVM性能优化思路Review
  3. 五笔常用字、难拆字 拆解图文版
  4. 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
  5. Linux errno 列表
  6. java上传视频代码下载_java 实现视频上传
  7. 配置mysql为主主复制步骤
  8. Linux查看文件的首个字母 文件属性字段
  9. 【转】使用CSS 禁止文本选择
  10. 计算机组成原理地址线不够,计算机组成原理小结和习题2
  11. HDOJ(HDU) 1563 Find your present!(异或)
  12. ngrok小米球的使用
  13. 3.在LCD12864上显示属于你的文字
  14. 抖音文案、声音、设计、视频、图片素材网站
  15. 元的符号在计算机怎么打出来,告诉你电脑上特殊符号怎么打出来?
  16. 麻将胡牌算法的Java实现
  17. 让虚拟机接入办公网络
  18. 造车失败后投身机器人和AI,我笑戴森太疯癫,戴森笑我看不穿
  19. 大数据可视化坐标轴的定制与绘制3D图表及统计地图
  20. python下载电影_Python抓取电影天堂电影信息的代码

热门文章

  1. Git 操作简单总结:廖雪峰教程
  2. 差分能量分析介绍(二)
  3. Mysql数据库五大常用数据引擎
  4. CSAPP实验二进制炸弹
  5. Androidstudio如何正确导入和移出jar包
  6. 15、Java Swing JSlider:滑块组件
  7. 9、Java Swing JRadioButton:单选按钮组件
  8. 7、恢复数据库(mysql命令)
  9. 108. 奇数码问题【思维 / 逆序对】
  10. ACM入门之【搜索】