首页 > 数据库 >Oracle中exists和in的性能差异

Oracle中exists和in的性能差异

时间:2024-08-12 16:51:30浏览次数:22  
标签:exists 结果 外表 差异 查询 Oracle 子表 执行

关于exists和in

exists关键字和in关键字都能实现外表查询后的结果过滤功能。在SQL语句性能优化方面,建议exists代替in进行子查询,实际上二者分场景进行使用。

低效
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = 'MELB')
高效
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND EXISTS (SELECT 'X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = 'MELB')
  • exists不关注子表查询之后的结果数据,只关心是否有符合条件后的数据记录的产生,这意味着优化器可以更早的停止执行子查询
  • in会查询所有子表中数据,其次外表进行查询时,会将每一行数据进行与子结果集比对

由此看来,exists是要比in性能更好,速度更快

二者内部执行规则

实际上,二者在执行查询方面存在不同。

  • 对于in,一般会先执行子查询,因为in会关注子查询的结果数据,所以会将子查询的结果缓存,然后执行外表查询,将每一行的数据与结果集比对,过滤结果,子查询的实际执行次数取决于子表行数。
  • 对于exists,因为不会关注子查询的结果数据本身,一般并不会缓存子查询结果,所以执行顺序为外表驱动内表,查询外表的每一行之后再执行exists子句,但是基于上述所说的只要子查询有记录产生,便条件为真,即可返回结果,它不需要实际获取子查询的所有结果。子查询的实际执行次数取决于外表行数。

这样,存在两种不同的应用场景,当外表数据量远大于子表时,推荐使用in关键字,当内表数据远大于子表时,推荐使用exists关键字

时间复杂度的粗略比较

可以对两者的时间复杂度进行粗略计算和比较,首先假设表中不存在任何字段的索引,因为对于有索引字段的查询,时间复杂度可以从O(n)优化到O(logn),为了对比,现在不考虑索引的情况,且外表m行,内表n行。

  • in

    • 先缓存子查询结果,子查询O(n),再做外表查询O(m),再做笛卡尔积比对运算,O(m*n)
  • exists

    • 对外表查询O(m),内表非全查询,理想情况查询第一条就符合条件直接终止子查询返回结果,最坏情况最后一条符合条件,子表介于O(1)到O(n),总O(m)~O(m*n)

粗略的比对,可以看出exist效率较高。

CBO优化器

对于Oracle 11g 版本后,引入了 Cost-Based Optimizer (CBO) ,CBO 优化器会根据统计信息来决定查询的最佳执行路径。不必过于纠结in和exists

标签:exists,结果,外表,差异,查询,Oracle,子表,执行
From: https://www.cnblogs.com/chuimber/p/18355270

相关文章

  • 中英文的思维差异——代码的命名方式不同
    中英文在叙述上很大的差别,在于语序的不同。就中文的表达而言,我们习惯经由一连串的铺陈来得出最后的结论,我们通常会先在句子的前半段找到一些背景资讯或者理由,来支撑后面的重点。然而,以英文的习惯来说,重要的地方就要必需要开门见山、一目了然地点明出来,也就是说,先果后因、先重点......
  • 【Oracle点滴积累】Oracle 19c安装Critical Patch Update for April 2022
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享如何为Oracle19c安装CriticalPatchUpdate(PatchNumber:33806138),本指引不包含RollBack部分。mkdir/home/oracle/Patchmkdir/home/oracle/PatchZipmkdir/home/oracle/Backup_ORACLE_H......
  • PostgreSQL备份版本差异分析
    PostgreSQL备份版本差异分析PostgreSQLV12中没有了recovery.conf从向后兼容的观点来看,PostgreSQLv12中最大的变化是recovery.conf文件中的参数放到了postgresql.conf配置文件中。放弃recovery.conf在PG12以前,如果数据目录存在recovery.conf文件,当PG实例启动时将进入恢复模式......
  • Oracle-OracleConnectorTask
    提示:OracleConnectorTask是一个Debezium连接器的具体实现,用于捕获Oracle数据库中的数据变化,并将这些变化以Kafka消息的形式发布出去。文章目录前言一、核心功能二、代码分析总结前言提示:OracleConnectorTask是一个重要的组件,它负责从Oracle数据库中捕获数据......
  • 14、Oracle中的Set运算符
    最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。视频链接:【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用如果有侵权,请联系删除,谢谢。学习目标:描述SET操作符将多个查询用SET操作符连接组成一个新的查......
  • 15、Oracle中的高级子查询
    最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。视频链接:【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用如果有侵权,请联系删除,谢谢。学习目标:书写多列子查询在FROM子句中使用子查询在SQL中使用单列子......
  • Oracle事务是怎么练成的
    什么是事务事务是数据库管理系统执行过程的一个逻辑单位,由一系列有限的数据库操作序列构成,事务必须满足‌ACID属性。ACID理论是数据库中最重要的概念之一,分别代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性是指事务是一个不可分割的......
  • Oracle数据库巡检
    数据库巡检列表序号业务系统1主机名2操作系统4单机/RAC4IP地址5地址类型6数据类型7数据库版本8实例名巡检方案检查方面具体检查内容检查标准集群配置集群软件版本集群软件版本要等于或高于DB软件版本集群服务状态各种服务状态(除GSD外)需是ONLINE注:使用asfforrac的环境下......
  • 读取EXCEL数据导入到oracle
    importpandasaspdimportcx_Oraclefromdatetimeimportdatetime#数据库连接信息username='****'#替换为您的用户名password='****'#替换为您的密码dsn='192.168.10.216:1521/ORCL'#替换为您的数据源名称#读取Excel文件excel_file=......
  • 掀起云端革命!ToDesk云电脑与传统PC电脑的差异分析
    在科技日新月异的今天,传统PC电脑的市场地位正悄然发生变化。随着云计算技术的不断成熟与普及,云电脑逐渐走进大众视野,不同于传统PC电脑的高昂的成本和易退化的硬件性能,云电脑正以其轻成本高性能的优势吸引来越来越多的用户。其中ToDesk云电脑的推出更是掀起了云端革命的新篇章。......