in 和 exists区别
in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)
1:
select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的
2:
select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如:
select staff_name from staff_member where staff_id in
(select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);
为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如:
select staff_name from staff_member where staff_id
exists (select staff_id from staff_func);
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论哪个表大,用not exists都比not in要快。
尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询:
select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where func_id like '81%');
分享到:
相关推荐
且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...
in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...
Presto OraclePlugin This is a plugin for Presto that allow ...Oracle Driver is not available in common repositories, so you will need to download it from Oracle and install manually in your repository.
### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...
使用以下命令将Oracle服务添加到自启动列表中: ``` # chkconfig --add oracle ``` ##### 5. 检查自启动服务状态 最后,检查Oracle服务是否已成功添加到自启动列表: ``` # chkconfig –list oracle ``` 如果一切...
### Oracle开机自启脚本详解 #### 一、概述 在CentOS 6.5系统中,为了确保Oracle 11g R2数据库...通过以上步骤,我们可以实现Oracle 11g R2在CentOS 6.5系统中的开机自启动功能,大大提高了系统的稳定性和可用性。
# if the executables do not exist -- display error if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ] then echo "Oracle startup: cannot start" exit 1 fi # depending on parameter -- startup, ...
3. **Xming & Xmanager**: 分别用于Windows环境下的X server和图形界面管理工具。 4. **PuTTY**: 用于远程登录Linux系统的工具。 #### 二、更新Ubuntu 确保Ubuntu系统是最新的状态,以便后续的安装过程能够顺利...
Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常以错误号的形式出现,帮助数据库管理员或开发者定位问题。以下是一些常见的Oracle错误号及其原因和解决办法: 1. ORA-01002:fetch out of sequence - 当...
- **RMAN Scripts in Toad**:介绍了如何在Toad中编写和执行RMAN脚本。 #### 九、比较与控制 - **Comparing**:涵盖了多种比较功能,如数据重复项检测、单个对象比较、数据库比较等。 - **Controlling Sessions**...
当Oracle执行包含“In”的查询时,它首先完全执行内层查询,生成一个结果集,然后再逐一检查外层查询中的每一行数据是否存在于这个结果集中。 ### “In”的适用场景 - 当内层查询的数据量较小时,使用“In”可以...
在Oracle 10g中,如果子查询中的`deptno`总是非空,`IN`和`EXISTS`的效率是相同的。而在Oracle 11g及更高版本中,无论子查询结果是否包含空值,两者效率都相仿。因此,选择`IN`还是`EXISTS`应基于具体环境和数据特性...
#### 十七、NOT EXIST与NOT IN的区别 NOT IN在某些情况下可能无法正常工作,尤其是在处理NULL值时。此时使用NOT EXISTS是一个更好的选择,因为它可以正确处理NULL值。 #### 十八、利用EXISTS代替COUNT DISTINCT ...
Oracle存储过程、函数和程序包是数据库管理中的重要概念,它们是PL/SQL语言的核心组成部分,用于构建复杂的数据库逻辑和业务规则。以下是这些概念的详细解释: 1. **存储过程**: - 存储过程是一组预编译的PL/SQL...
- **避免使用DISTINCT**:在一对多查询时,应避免在SELECT中使用DISTINCT,可以考虑使用EXIST替换。 - **避免计算索引列**:索引列不应参与计算,避免IS NULL和IS NOT NULL操作。 - **使用函数索引**:对于特定...
-------------------------------------------------------------------------------------Deployment InstructionsOracle Layer The Oracle JServer must be installed and exist in a valid state. Ensure that ...
在Oracle数据库中,有时我们需要在存储过程中执行操作系统级别的任务,例如访问文件系统、调用API等。这通常是为了实现特定的业务逻辑,而PL/SQL本身并不直接支持这些功能。在这种情况下,我们可以利用Oracle的Java...
在企业级应用环境中,数据库的安全性和数据的完整性至关重要。为了确保数据的安全性,通常需要定期对数据库进行备份。Oracle数据库作为业界广泛使用的数据库管理系统之一,提供了多种备份和恢复机制。本文档主要介绍...
Oracle的PL/SQL程序设计是数据库管理中一个重要的部分,主要涉及存储过程、函数、局部子程序和包等概念,这些功能模块使得开发者能够编写复杂的业务逻辑并存储在数据库中,便于高效执行和管理。 15.1 存储子程序 ...