Spark SQL优化:NOT IN子查询优化解决

news2024/11/21 2:21:35

背景

有如下的数据查询场景。

SELECT  a
       ,b
       ,c
       ,d
       ,e
       ,f
FROM xxx.BBBB
WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
AND predict_type  
not IN 
( 
   SELECT 
		distinct a 
   FROM 
   xxx.AAAAA
   WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
)

分析

通过查看SQL语句的执行计划基本就可以判断性能瓶颈所在。

  1. | == Physical Plan ==

  2. BroadcastNestedLoopJoin BuildRight,

Spark SQL的优化器最终将SQL优化为了一个BroadcastNestedLoopJoin。

实际上就是在对JOIN两侧的数据做笛卡尔积运算。时间复杂度为O(n^{2}),过滤前的结果集行数达到了万亿级别。

优化方法

尝试将NOT IN子查询改写成了LEFT JOIN形式

SELECT  a.*
FROM
(
	SELECT  a
	       ,b
	       ,c
	       ,d
	       ,e
	       ,f
	FROM xxx.BBBB
	WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}'
) a
LEFT JOIN
(
	SELECT  c
	FROM xxx.AAAA
	WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
) b
ON a.c = b.c 
WHERE b.c is null

执行计划如下:

  1. Filter is null(#391L)

  2. +- SortMergeJoin

可以看到,JOIN方式变成了SortMergeJoin。

SortMergeJoin的原理是对JOIN两侧的数据排序后在做归并。

不妨假设:

排序的时间复杂度为O(nlogn)。
则SortMergeJoin整体的时间复杂度为O(n + nlogn),依然是百万级数据量的过滤计算。

在数据库查询优化中,"Broadcast Nested Loop Join" 和 "Sort Merge Join" 是两种不同的关联操作算法。

Broadcast Nested Loop Join:
在这种连接算法中,一张表被广播到其他所有的节点上,然后与每个节点上的本地数据进行嵌套循环连接。这通常适用于一个小表和一个大表的连接,其中小表的数据可以很容易地广播到所有节点上。

优势:
1. 适用于小表连接
: 当一个表很小而另一个表很大时,广播小表可以减少网络传输和数据传输开销。
2. 简单性: 实现相对简单,不需要进行大规模数据排序。
3. 内存友好: 不需要大量的内存,因为每次只处理小表的一行。

Sort Merge Join:
这是一种更加通用的连接算法,它不涉及表的广播,而是将连接的列进行排序,然后按照排序结果进行逐对比较,从而执行连接操作。

优势:
1. 适用于大表连接
:当两个表的大小都比较大时,Sort Merge Join 可以更好地处理连接操作,因为不需要将整个表广播到各个节点。
2. 高效的顺序访问:由于涉及数据的排序,Sort Merge Join 可以更好地利用磁盘预读,提高磁盘数据访问效率。
3. 稳定性:对于不同数据分布的情况,Sort Merge Join 的性能通常比 Broadcast Nested Loop Join 更稳定。

所以,Broadcast Nested Loop Join 适用于小表和大表之间的连接,而 Sort Merge Join 则更适合连接两个较大的表。但请注意,具体的性能取决于数据分布、硬件配置和数据库管理系统的优化能力。在实际情况中,优化器可能会根据统计信息和其他因素来选择最适合的连接算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面管控企业资产,这个小妙招做到了!

随着全球金融市场的复杂性增加以及资产多样化的趋势,确保资产的最大价值和最小风险已经成为一个迫切的需求。资产管理系统能够更好地掌握自己的财务状况,做出明智的决策。 从个人投资者到大型企业,都可以从中受益,无论是实时监控投…

腾讯云GPU服务器GN7实例NVIDIA T4 GPU卡

腾讯云GPU服务器GN7实例搭载1颗 NVIDIA T4 GPU,8核32G配置,系统盘为100G 高性能云硬盘,自带5M公网带宽,系统镜像可选Linux和Windows,地域可选广州/上海/北京/新加坡/南京/重庆/成都/首尔/中国香港/德国/东京/曼谷/硅谷…

C#如何打包EXE程序生成setup安装文件

项目结束之后,有需要将winForm程序打包成.exe文件提供给用户。 这里记录一下打包过程。 1:首先获取打包插件,如果你的VS已经安装,忽略此步骤。 点击 工具->扩展和更新,选择联机,搜索installer&#x…

AntPro 模版代码

1 ProTable 实现选择和反显 页面1 页面2 选择页面2选择之后反显到页面1 &#xff0c;且支持跨页选择。同时下次进来页面1展示的数据要反显到页面2被选中。 页面2代码 <ProTablerowKey"id"columns{columns}request{(params: any) > {const newParams {pageI…

androidstudio引入jar包

如图&#xff0c;选择project 然后在src下创建一个lib文件夹&#xff0c;将要添加到项目中的jar包粘贴lib里面&#xff0c;如图 接着选中jar包&#xff0c;右击&#xff0c;会出一个弹窗&#xff0c;选择Add As Library…&#xff0c;如图 会出现一个弹窗&#xff0c;点击OK…

安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

<kernel>kernel 6.4 USB-之-hub_event()分析

&#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_event()分析 本文是基于linux kernel 6.4版本内核分析&#xff1b;源码下载路径&#xff1a;linux kernel 本文主要分析hub_event()函数的内容&#xff1b;hub_event()函数是Linux内核USB子系统中的一个函数&#xff0c…

面试之ReentrantLock

一&#xff0c;ReentrantLock 1.ReentrantLock是什么&#xff1f; ReentrantLock实现了Lock接口&#xff0c;是一个可重入且独占式的锁&#xff0c;和Synchronized关键字类似&#xff0c;不过ReentrantLock更灵活&#xff0c;更强大&#xff0c;增加了轮询、超时、中断、公平锁…

侯捷 C++ part2 兼谈对象模型笔记——7 reference、const、new/delete

7 reference、const、new/delete 7.1 reference x 是整数&#xff0c;占4字节&#xff1b;p 是指针占4字节&#xff08;32位&#xff09;&#xff1b;r 代表x&#xff0c;那么r也是整数&#xff0c;占4字节 int x 0; int* p &x; // 地址和指针是互通的 int& r x;…

windows电脑简单实时tts语音播报wsay;python pyttsx3语言实时播报text-to-speech;微软edge-tts 音色自然离线不实时

1、wsay 参考&#xff1a; https://github.com/p-groarke/wsay 下载安装&#xff1a; https://github.com/p-groarke/wsay/releases/tag/v1.5.0 下载exe文件&#xff0c;并把加入环境变量就可 使用 # Say something. wsay "Hello there."wsay "你好"…

图书馆管理系统、学生管理系统、交通管理系统(C语言、数据结构、java、Javaweb)

图书馆管理系统作为一个经典的项目&#xff0c;在国家、学校、等每个地方或者作为期末作品都用的非常广泛&#xff1a; C语言程序设计&#xff1a;图书馆管理系统含说明文档。 大一时C综合设计&#xff0c;当时得了96。代码纯原创&#xff0c;可直接运行&#xff0c;包含详细注…

springboot多数据源配置,看这一篇就够了

springboot下多数据源配置实现 不管是两个mysql&#xff0c;还是一个mysql一个oracle&#xff0c;都是一样的操作 目录 springboot下多数据源配置实现配置application.yml文件数据源配置类创建mapper接口创建mapper的xml配置文件 你可能会遇到的问题 配置application.yml文件 …

无涯教程-Perl - study函数

描述 此功能需要花费额外的时间来研究EXPR,以改善在EXPR上执行的正则表达式的性能。如果省略EXPR,则使用$_。实际的速度增益可能非常小,具体取决于您希望搜索字符串的次数。 您一次只能学习一种表达式或标量。 语法 以下是此函数的简单语法- study EXPRstudy返回值 此函数…

Scala 如何调试隐式转换--隐式转换代码的显示展示

方法1 在需要隐式转换的地方&#xff0c;把需要的参数显示的写出。 略方法2&#xff0c;查看编译代码 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例。 对于复杂的工程来说&#xff0c;直接跑到terminal执行 scalac -Xprint:typer xxx.…

薅羊毛!我用这款AI工具,免费拿下12张漫画头像

今天l1m0_将为大家分享一款AI生图工具&#xff0c;并介绍如何通过Pixso AI&#xff0c;用自己的照片&#xff0c;免费一键生成AI漫画头像&#xff0c;一起来看看吧。 这里我用Pixso资源社区的一组用户头像资源&#xff0c;为大家演示&#xff0c;如何快速生成AI漫画头像。 首先…

小程序开发:如何选择合适的开发工具和平台?

小程序是一种基于微信平台的轻量级应用程序&#xff0c;具有操作简便、体验流畅等优点。然而&#xff0c;对于许多中小企业来说&#xff0c;三五万的开发成本可能过高&#xff0c;让人感到犹豫。 首先&#xff0c;三五万的成本包括了开发人员的费用、服务器费用、推广费用等。对…

JS大纲简介

1 HTML中的JavaScript js引用文件可以放在两个位置&#xff0c;一种是html中的head中&#xff0c;一种是html中的body中&#xff1b;放置在这两个位置&#xff0c;有何区别呢&#xff1f; 1.1 使用<script>元素的方式 1.1.1 放置在 head 中 引用example.js文件&#…

微信公众号扫码实现网站登录-Django+Vue版本-超详细保姆级教程

实现网页端微信扫码登录有三种方式&#xff1a; PlanA&#xff1a;微信开放平台 — 需认证 — 300元PlanB&#xff1a;微信公众号 — 需服务号且已认证 — 300元PlanC&#xff1a;微信小程序 — 需已上线备案的小程序 — 0元 本教程为Djangovue举例的微信公众号扫码登录&#…

.Net程序调试时接受外部命令行参数方式

1.对项目右键&#xff0c;属性 2.在调试中打开常规&#xff0c;打开调试启动配置文件UI 3.输入需要的命令行参数

Vue3 setup中使用$refs

在 Vue 3 中的 Composition API 中&#xff0c;$refs 并不直接可用于 setup 函数。这是因为 $refs 是 Vue 2 的实例属性&#xff0c;而在 Vue 3 中&#xff0c;setup 函数是与模板实例分离的&#xff0c;不再使用实例属性。 实际工作中确实有需求&#xff0c;在setup 函数使用…