oracle 半连接 效率,关于oracle中的半连接
表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。
像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。
--in半连接
SQL> select dname from dept dept where deptno in (select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--exists半连接
SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)
2 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。
比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。
SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;
DNAME
--------------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
14 rows selected.
所以说如果要得到一个相同的输出结果,还是需要distinct+inner join
SQL> select distinctdept.dname from dept dept,emp emp where dept.deptno=emp.deptno;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
对于半连接的可替换实现,大体有以下几种方式
--使用集合
select dept.dname from dept dept,
(select deptno from dept
intersect
select deptno from emp emp)b
where dept.deptno=b.deptno ;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
--使用any
SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--使用distinct和内连接
SQL> select distinct emp.deptnofrom dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
SQL> select distinct dept.deptnofrom dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。
启用了半连接,在执行计划中会有semi的字样。
也可以手动指定不需要走半连接。使用Hint no_semijoin
oracle 半连接 效率,关于oracle中的半连接相关推荐
- oracle 去重效率最高,oracle去重整理
我们在实际工作中,当信息系统数据质量不高的时候,可能存在数据表中有重复记录的问题.方法: 1.保留重复记录中的一条 delete from t where rowid not in ( ...
- oracle nvl 效率,说说 Oracle 的 NVL 与 NVL2 函数
1 NVL 函数 1.1 语法 如果需要为查询出的为 null 的字段,设置一个默认值,就可以使用 NVL 函数.如果 expr1 为 null ,则 NVL 会返回 expr2. 如果 expr1 ...
- 简单介绍oracle执行计划,Oracle性能优化之oracle中常见的执行计划及其简单解释
一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...
- 提高oracle查询效率
转载自: http://zhidao.baidu.com/link?url=E_HaRWGF3wCYYKG1l-qg5pNmjsePoH3wo_81Zpf5GaytfIW869RhWTIR6_jGPh ...
- oracle触发器比较,Oracle使用触发器和mysql中使用触发器的比较
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- 运用PARALLEL方式成倍提升Oracle数据分析效率
运用PARALLEL方式成倍提升Oracle数据分析效率 Oracle作为一种大型数据库,在我国已成为大型企事业单位(如公立医院)的主流数据库并占有了绝对的市场份额.这就意味着审计工作同Oracle的 ...
- oracle 在此 select 语句中缺少 into 子句,Go database/sql文档
No.1 文档概要 在Golang中使用SQL或类似SQL的数据库的惯用方法是通过 database/sql 包操作.它为面向行的数据库提供了轻量级的接口.这篇文章是关于如何使用它,最常见的参考. 为 ...
- timesten mysql_Timesten(TT)和ORACLE执行效率测试
Timesten(TT)和ORACLE执行效率测试 TT是一个内存数据库,在某些方面执行要比oracle快,因为代码路径和优化器 都没有oracle那么复杂,即使把oracle的数据全部cache到s ...
- oracle 设置忽略关键字,Oracle中Hint被忽略的几种常见情形
Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略目标SQL中的Hint.由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警 ...
最新文章
- Pandownload 下线了,我自己花了 30 分钟自己搭建了一个网盘
- 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...
- PySpider HTTP 599: SSL certificate problem错误的解决方法
- 拓扑排序(Topology_Sort)
- Tcpdump(linux)下载、安装、使用说明
- Python深入类和对象
- linux 关于休眠得脚本,linux – 如果条件为true,请将cron作业休眠5分钟
- C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)
- Python爬虫项目:抓取智联招聘信息
- cisco初级随堂笔记1
- Arduino 超声波避障循迹小车,四轮智能小车
- 厉害!不到30行代码,自制成语接龙小游戏
- 修改Linux swap大小,LINUX操作系统如何调整SWAP大小
- 小小白的Android入门之计算器学习
- 从TikTok功能优化,抓住直播带货机遇
- 红帽牵手阿里云,水到渠成的合作
- 清北学堂 2017-10-06
- 模糊查询忽略大小写解决方案
- ArcGIS Pro制图-河流曲线图例
- Ubuntu PPA 软件源用法介绍
热门文章
- idea补全代码快捷键
- 将d:\java目录下的所有.java文件复制到d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad
- leetcode 385. Mini Parser | 385. 迷你语法分析器(Java)
- leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
- netty系列之:使用UDP协议
- linux上设置git高亮
- jQuery的概念、用法、常见面试题详解
- 23行代码_动图展示——快排详解(排序最快的经典算法)
- 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)
- java虚拟机内存空间