加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – JOIN与EXISTS性能

发布时间:2020-12-12 07:06:39 所属栏目:MsSql教程 来源:网络整理
导读:一般来说,使用JOIN选择行与EXISTS where子句之间是否存在性能差异?搜索各种Q A网站表明联接更有效率,但我记得很久以前在Teradata中学习EXISTS更好. 我确实看到其他SO答案,如this和this,但我的问题是Teradata特有的. 例如,考虑这两个返回相同结果的查询: sel
一般来说,使用JOIN选择行与EXISTS where子句之间是否存在性能差异?搜索各种Q& A网站表明联接更有效率,但我记得很久以前在Teradata中学习EXISTS更好.

我确实看到其他SO答案,如this和this,但我的问题是Teradata特有的.

例如,考虑这两个返回相同结果的查询:

select   svc.ltv_scr,count(*) as freq
from     MY_BASE_TABLE svc
join     MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
group by 1
order by 1

-和-

select   svc.ltv_scr,count(*) as freq
from     MY_BASE_TABLE svc
where exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1

两个表上的主索引(唯一)是’srv_accs_id’. MY_BASE_TABLE相当大(2亿行),MY_TARGET_TABLE相对较小(200,000行).

EXPLAIN计划有一个显着的区别:第一个表示两个表“通过RowHash匹配扫描”连接,第二个表示“通过全行扫描”.两者都说它是“全AMP加入步骤”,总估计时间相同(0.32秒).

两个查询都执行相同的操作(我正在使用Teradata 13.10).

一个类似的实验,找到将LEFT OUTER JOIN与相应的IS NULL where子句与NOT EXISTS子查询进行比较的非匹配确实显示了性能差异:

select   svc.ltv_scr,count(*) as freq
from     MY_BASE_TABLE svc
left outer join MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
where    x.srv_accs_id is null
group by 1
order by 1

-和-

select   svc.ltv_scr,count(*) as freq
from     MY_BASE_TABLE svc
where not exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1

第二个查询计划更快(如EXPLAIN所述,2.21对2.14秒).

我的例子可能太微不足道了,看不出差异;我只是在寻找编码指导.

解决方法

NOT EXISTS比使用LEFT OUTER JOIN使用IS NULL条件排除参与表中丢失的记录更有效,因为优化器将选择使用带有NOT EXISTS谓词的排除MERGE JOIN.

虽然您的第二次测试没有给数据集带来令人印象深刻的结果,但是当您的数据量增加时,您使用NOT EXISTS相对于LEFT JOIN的性能提升非常明显.请记住,表格需要由参与NOT EXISTS连接的列进行哈希分布,就像它们在LEFT JOIN中一样.因此,数据倾斜会影响EXCLUSION MERGE JOIN的性能.

编辑:

通常,我会将EXISTS作为IN的替代,而不是用它来重写连接解决方??案.当参与逻辑比较的列可以为NULL时尤其如此.这并不是说你不能用EXISTS代替INNER JOIN.而不是排除加入,你将最终得到一个包含加入. INNER JOIN本质上是一个包含连接开头.我确信我会忽略一些细微差别,但如果您想花时间阅读它们,可以在手册中找到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读