首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OB 运维 | 一个关于 NOT IN 子查询的 SQL 优化案例

对比 Oracle 执行计划 Tips:当 OB 上看到的执行计划不符合预期,但又找不到原因时,可以对比 Oracle 的执行计划。...Oracle 上执行计划如下(这里得用 set autotrace on 的方式查看真实执行计划): 可以使用 HASH ANTI JOIN,并且有个重要信息 HASH JOIN RIGHT ANTI...NOT IN 的语义其实是说如果有相等的值,则外表结果丢弃,因此本质上 NOT IN 的实现方式还是做等值查找,所以 HASH ANTI JOIN 的实现本质和 HASH JOIN 一样,只是在返回结果时做了相反的判断...上看看 NESTED-LOOP ANTI JOIN NA 的处理逻辑,不过在 Oracle 上调不出这个执行计划,因此线索中断。...推断: 目前 3.x 版本没有实现真正意义上的 NESTED-LOOP ANTI JOIN NA,但是 NESTED-LOOP ANTI JOIN 可以正确处理 NULL 敏感。

17410

HiveSQL中的JOIN ON条件,你理解对了吗?

,对于左表符合关联的数据,输出左表,没有符合的,左表补null Full Join 输出左表和右表的所有记录,对于没有关联上的数据,未关联的另一侧补null Left Semi Join 对于左表中的一条数据...,如果右表存在符合关联条件的行,则输出左表 Left Anti Join 对于左表中的一条数据,如果对于右表所有的行,不存在符合关联条件的数据,则输出左表 JOIN的通用格式 SELECT.../RIGHT/FULL/LEFT SEMI/LEFT ANTI} JOIN ( SELECT * FROM b...INNER JOIN比较特殊,由于只匹配能关联上的数据,所以无论过滤条件怎么写,最终的结果都是一致的。即便是这样,在实际的开发过程中建议使用情况1的方式进行书写,避免不必要的问题出现。...b.ds = '20220101' 对于不满足关联条件的表输出数据,另一表输出NULL。

1.6K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【DB笔试面试590】在Oracle中,什么是反连接(Anti Join)?

    ♣ 题目部分 在Oracle中,什么是反连接(Anti Join)? ♣ 答案部分 反连接(Anti Join)也是一种特殊的连接类型,通常用于从一个表中返回不在另一个数据源中的数据行。...为了解决NOT IN和 ALL对NULL值敏感的问题,Oracle推出了改良的反连接,这种反连接能够处理NULL值,Oracle称其为Null-Aware Anti Join,如下例: SELECT...Operation的值为“HASH JOIN ANTI NA”,关键字“NA”就是Null-Aware的缩写,表示这里采用的不是普通的哈希反连接,而是改良后的、能够处理NULL值的哈希反连接。...在Oracle 11gR2中,Oracle是否启用Null-Aware Anti Join受隐含参数“_OPTIMIZER_NULL_AWARE_ANTIJOIN”控制,其默认值为TRUE,表示启用Null-Aware...如果把该参数的值修改为FALSE,那么表示Oracle就不能再用Null-Aware Anti Join了,而又因为NOT IN对NULL值敏感,所以Oracle此时也不能用普通的反连接。

    1.2K20

    浅谈数据库Join的实现原理

    (内部联接)、Left Outer Join(左外部联接)、Left Semi Join(左半部联接)和Left Anti Semi Join(左反半部联接)逻辑操作。...如果关联字段有可用的索引,并且排序一致,则可以直接进行Merge Join操作;否则,SQL Server需要先对关联的表按照关联字段进行一次排序(就是说在Merge Join前的两个输入上,可能都需要执行一个...在多对多的关联表上执行Merge Join时,通常需要使用临时表进行操作。...(内部联接)、Left Outer Join(左外部联接)、Left Semi Join(左半部联接)、Left Anti Semi Join(左反半部联接)、Right Outer Join(右外部联接...)、Right Semi Join(右半部联接)、Right Anti Semi Join(右反半部联接)和Union(联合)逻辑操作。

    5.4K100

    Oracle 查询技巧与优化(二) 多表查询「建议收藏」

    前言 上一篇blog介绍了Oracle中的单表查询和排序的相关技巧(http://blog.csdn.net/wlwlwlwl015/article/details/52083588),本篇blog继续介绍查询中用的最多的...多表查询 上一篇中提到了学生信息表的民族代码(mzdm_)这个字段通常应该关联字典表来查询其对应的汉字,实际上我们也是这么做的,首先简单看一下表结构,首先是字典表: 如上图,可以看到每个民族代码和名称都是由两个字段...LEFT JOIN 如题,LEFT JOIN是以左表为主表,返回左表的全部数据,右表只返回相匹配的数据,将上面的SQL改为LEFT JOIN看一下: select t1.sid, t1.stuname,...RIGHT JOIN 如题,RIGHT JOIN和LEFT JOIN是相反的,以右表数据为主表,左表仅返回相匹配的数据,同理将上面的SQL改写为RIGHT JOIN的形式: select t1.sid,...RIGHT ANTI,所以它们的效率是一样的,所以在Oracle11g中关于NOT IN和NOT EXISTS也没有绝对的效率优劣,依旧是要通过PLAN来判断和测试哪种更高效。

    1.9K20

    CBO 查询转换(2):反结合的NULL识别机能(null aware anti-join )

    其实上一篇文章的初衷是为了捋顺一下 null aware anti-join 机能做的一个铺垫。...反结合的NULL识别机能(null aware anti-join ) 前面的文章已经说过了子查询展开机能,这个机能在有些时候是没法使用的,比如 NOT IN 子句中坑包含 NULL 。...那这种情况下,CBO 如何来转换用户的 SQL 呢。11g 开始 Oracle 为我们提供了 null aware anti-join 机能,我们再来看看这个机能长什么样子。...如果使用 null aware anti-join 机能后呢,就是下面的样子了。...当然,我们在写 SQL 的时候假如能把带有 NULL 的可能性给排除掉的话,我认为是最理想的,可以避免很多不必要的麻烦,这就要求各位程序员同学们编写 SQL 时需要注意到一些细节,不要过分指望 Oracle

    27810

    Impala Join类型介绍

    例如,如果我们使用left semi join的话,那就只会返回左表中匹配到的数据(注意这里与left outer join的区别),我们使用如下的SQL进行测试: select id,name from...semi join的结果,分别如下的左图和右图所示,结合SQL我们可以发现,left semi join其实就是只返回left outer join中,左表的数据,right semi join也是同样的道理...left semi join department on employee.dept_id = department.depart_id; ANTI JOIN 这种join方式与semi-join一样...例如,left anti join返回的是左表中,没有在右表匹配到的记录,这里解释起来比较绕,我们直接看这个例子: select id,name from employee left anti join...join department on employee.dept_id = department.depart_id; 我们可以看到,对于left anti join返回的结果,是对于left semi

    2K20

    图文并茂详解 SQL JOIN

    不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在RDBMS中有多种应用场合。...: [0] Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生 https://my.oschina.net/leejun2005/blog/188459 注: 1、mysql... left semi join 语法 4、注意 Anti-semi-join 与 anti-join 区别 5、select * from A,B; 不带 where 或者 join 等同于 cross...join,带 where 或   等同于 inner join 6、left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join...on 默认是整个关系模型都参与计算了 7、对待右表中重复key的处理方式差异:因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join on 则会一直遍历做

    3.3K80

    空与非空:浅谈非空约束的影响

    注意:当逻辑表达是中的操作数可能为空时,LNNVL函数可以判断出该表达式的结果。 我们再把非空约束加上, 统计信息如下 可以看到执行计划通过ANTI-JOIN获取我们需要的数据,性能大为改善。...这也就是空值的存在不会影响JOIN或SEMI-JOIN的原因。...ANTI-JOIN,通过关联方法(NESTED-LOOP、MERGE、HASH)判断记录是否符合条件,一旦发现两边记录可以关联上,则判定不符合要求,可以放弃对一个数据集中的剩余数据的判断,因而能提高性能...而关联是同等价匹配(=)实现的,不适合空值数据。因此,关联字段可能存在空值时,无法采用ANTI-JOIN。...注意:无论是否存在空值,NOT EXISTS都可以采用ANTI-JOIN,但是它的逻辑结果与NOT IN并不等价。

    3.2K40

    ACCESS - 六大数据模型sql代码

    1、左外部:left outer 2、右外部:right outer 3、完全外部:full outer 4、内部:inner 5、左反:left anti 6、右反:right anti ---- -...---- sql代码 1、左外部:left outer SELECT DISTINCT t_SaleRecord.ProductCode FROM t_SaleRecord LEFT JOIN t_CurrentlySale...3、完全外部:full outer 也就是两张表的并集,要求两张表的查询结果具有相同的字段个数(不要求两个表具有相同的字段数),并且对应的字段的值要出自同一个值域,即具有相同的数据类型和取值范围。...5、左反:left anti SELECT DISTINCT t_SaleRecord.ProductCode FROM t_SaleRecord LEFT JOIN t_CurrentlySale ON...6、右反:right anti SELECT DISTINCT t_CurrentlySale.ProductCode FROM t_SaleRecord RIGHT JOIN t_CurrentlySale

    60830

    R语言第二章数据处理(9)数据合并

    函数 join函数: join(x, y, by = NULL, = 'left', match = 'all') x,y 为合并的数据框 by 为排序依据,默认值Null时按名字相同的量匹配,此时,...join为系列函数,包括inner_join、left_join、semi_join和anti_join函数 dplyr包的join函数似乎没有plyr包的join函数的match参数,只能进行所谓的...) inner_join(data1,data2, c('city' = 'city')) left_join函数 结果, 行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字...library(dplyr) # 单指标匹配 left_join(data1,data2) left_join(data1,data2, c('city' = 'city')) semi_join函数...而anti_join其实就是a独有的记录 library(dplyr) # 单指标匹配 anti_join(data1,data2) anti_join(data1,data2, c('city'

    2.4K20

    深入解析:半连接与反连接的原理和等价改写方法

    DEPTNO") Inner join 多了 group by 的操作,emp 的 depno 值不是唯一的,要保证逻辑上跟半连接的一致就需要把 emp 的连接进行去重操作,跟上面 emp 作为驱动表是一致的...执行计划: NESTED LOOP ANTI HASH JOIN ANTI 1.1 NESTED LOOP ANTI NESTED LOOP ANTI 执行步骤: 优化器选择主查询中的表为驱动表; 选择子查询中的表为被驱动表...a left join emp b on a.deptno = b.deptno where b.deptno is null; 加上 b.deptno is null 就返回了没有关联上的数据...DEPTNO") 1.2 HASH JOIN ANTI 执行步骤: 优化器把主查询中的表当作驱动表,把 select 列和 join 列读入 pga 中,并把 join 列进行 hash 运算构建...,反连接一般是出现在子查询有 NOT IN 或者 NOT EXISTS 的情况,并且只返回主表连接列没有关联上的数据,NEST LOOP ANTI 不能改驱动表。

    75310

    一文详解 Apache Flink Semi Anti Join 实现原理

    前言 最近再调研业界一些计算引擎的 Semi / Anti Join 的实现方式,刚好对 Flink Semi / Anti Join 的实现方式进行了研究,通过对 Flink SemiAntiJoinTest...的单测以及源码的 Debug,目前整体对 Flink 实现 Semi / Anti Join 的原理有一定理解,所以这里整体做一个总结,同时也帮助大家对于 Flink 有个更好的理解。...这样做的原因,我个人理解有两点: 当将关联子查询里面的 Filter 条件提取出来时,对于合取范式形式的谓词,可以直接提取到外侧 SemiJoin 的 Join 条件上,语义不变。...Flink 中对于 SemiJoin/AntiJoin 有自己相应的 Operator 的实现,整体上支持的场景会更加广泛。...Calcite 当前不支持 AntiJoin 的转换规则,对于 SemiJoin 的转换,能够使用SemiJoinRule来将符合条件的 Join(Inner、Left)转换为 SemiJoin。

    18110

    MYSQL Whats new in 优化和执行 来自旧金山的问候

    funciton 和 common table expressions CTE 图片截取的不是很清晰(其实我看着也费劲),其中对比的熟即可有 DB2 MariaDB MYSQL ORACLE Postgresql...不支持, 从总分和颜色上看,MYSQL 是这里面最好的,其次是POSTGRESQL ,然后是ORACLE 和 DB2 最后是SQL SERVER。...(之前写过一篇直方图的文字) 继续是HINTS 这里演讲者一带而过,提出MYSQL 8 对语句的处理进行了整体的优化,上到单个语句,下到JOIN ,并且在MYSQL 8 可以抛弃 straight join...EXISTS 变化为 anti-semi-join 的方式来处理。...其中对于 ANTI-SEMI-JOIN 中提到 not exists 和 not in 将直接转换为 anti-semi-join 在查询在内部被重写为antijoin,它返回类中不匹配的每一行的一个实例

    51520

    深入SQL执行计划之CBO查询转换(7):Distinct 配置最优机能(Distinct Placement)

    编辑|SQL和数据库技术(ID:SQLplusDB) CBO 查询转换系列(深入了解Oracle执行计划) CBO 查询转换(1):子查询展开机能(Subquery Unnesting) CBO 查询转换...(2):反结合的NULL识别机能(null aware anti-join ) CBO 查询转换(3):结合谓词下推机能(Join Predicate Pushdown) CBO 查询转换 (4):Group...Placement) CBO查询转换(5):星型转换(Star Transformation) CBO查询转换(6):子查询关联集展开机能(unnest correlation set subquery) 同之前聊过的...还是用下面的 Test case 进行简单的演示,说明一下 Distinct Placement 动作时执行计划的样子。...| HASH UNIQUE | | 2 | 104 | 8 (25)| 00:00:01 | |* 2 | HASH JOIN

    46010

    深入解析:半连接与反连接的原理和等价改写方法

    DEPTNO") Inner join 多了 group by 的操作,emp 的 depno 值不是唯一的,要保证逻辑上跟半连接的一致就需要把 emp 的连接进行去重操作,跟上面 emp 作为驱动表是一致的...执行计划: NESTED LOOP ANTI HASH JOIN ANTI 1.1 NESTED LOOP ANTI NESTED LOOP ANTI 执行步骤: 优化器选择主查询中的表为驱动表; 选择子查询中的表为被驱动表....* from dept a left join emp b on a.deptno = b.deptno; ?...DEPTNO") 1.2 HASH JOIN ANTI 执行步骤: 优化器把主查询中的表当作驱动表,把 select 列和 join 列读入 pga 中,并把 join 列进行 hash 运算构建...,反连接一般是出现在子查询有 NOT IN 或者 NOT EXISTS 的情况,并且只返回主表连接列没有关联上的数据,NEST LOOP ANTI 不能改驱动表。

    1.9K70
    领券