oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
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 | 学步园相关推荐
- oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)
理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...
- oracle表加引号,oracle 表名 双引号 删除 | 学步园
oracle10g中,建表的时候没注意,用别人发给我的sql直接创建的,创建之后发现 select * from 表名 ;提示表或视图不存在后来仔细查看发现是在create的时候,表名和字段名都被 ...
- Oracle数据库中的方案,学习Oracle数据库_理解Oracle数据库中的方案
理解数据库.表空间.数据文件之间的关系. 每个表空间由一个或多个数据文件组成.数据文件用于在物理上存储表空间中所有逻辑结构的数据.表空间中数据文件的大小之和就是表空间的存储容量(图中系统表空间存储容量 ...
- oracle中@,深入理解Oracle中的DBCA
但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...
- oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁
oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这 ...
- 怎么全量备份oracle数据库,Oracle 数据库全量备份恢复和部分备份恢复 | 学步园...
今天又遇到了Oracle数据库序列的问题,索性来个全库的备份和恢复.如下 imp/exp 方式 表模式备份: oracle@sencloudServer: exp dhoffice/dhoffic ...
- servlet文件上传blob_servlet实现从oracle数据库的blob字段中读出文件并显示 | 学步园...
/* * ReadFile.java * * Created on 2004年11月17日, 下午3:41 */ package jgwl.app; import java.io.*; import ...
- oracle 比对时分秒,关于Oracle数据库不带日期中时分秒的查询 | 学步园
关于Oralce数据库 的日期时间查询: 下面我们先来看一组日期数据 表:myDate 列:time; 1998-8-7 23:45:33.3 1998-8-7 11:22:21.5 1998-8-7 ...
- date oracle 显示毫秒_oracle数据库to_date日期格式化到毫秒 | 学步园
事由:一个数据导入功能,其通过视图表里一条数据的时间字段作为判断是否已导入的标识. 每次记录最后导入的一条数据的时间字段,下一次判断则导入上一次记录下的时间字段值以后的数据. 失败经验:网上看到有网友 ...
最新文章
- php仿tp5实现模型,php手记之05-tp5模型操作数据库
- jvm性能调优实战 - 42JVM性能优化思路Review
- 五笔常用字、难拆字 拆解图文版
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
- Linux errno 列表
- java上传视频代码下载_java 实现视频上传
- 配置mysql为主主复制步骤
- Linux查看文件的首个字母 文件属性字段
- 【转】使用CSS 禁止文本选择
- 计算机组成原理地址线不够,计算机组成原理小结和习题2
- HDOJ(HDU) 1563 Find your present!(异或)
- ngrok小米球的使用
- 3.在LCD12864上显示属于你的文字
- 抖音文案、声音、设计、视频、图片素材网站
- 元的符号在计算机怎么打出来,告诉你电脑上特殊符号怎么打出来?
- 麻将胡牌算法的Java实现
- 让虚拟机接入办公网络
- 造车失败后投身机器人和AI,我笑戴森太疯癫,戴森笑我看不穿
- 大数据可视化坐标轴的定制与绘制3D图表及统计地图
- python下载电影_Python抓取电影天堂电影信息的代码