Spark SQL优化:NOT IN子查询优化解决
背景
有如下的数据查询场景。
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.AAAAAWHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}'
)
分析
通过查看SQL语句的执行计划基本就可以判断性能瓶颈所在。
| == Physical Plan ==
BroadcastNestedLoopJoin BuildRight,
Spark SQL的优化器最终将SQL优化为了一个BroadcastNestedLoopJoin。
实际上就是在对JOIN两侧的数据做笛卡尔积运算。时间复杂度为O(),过滤前的结果集行数达到了万亿级别。
优化方法
尝试将NOT IN子查询改写成了LEFT JOIN形式
SELECT a.*
FROM
(SELECT a,b,c,d,e,fFROM xxx.BBBBWHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}'
) a
LEFT JOIN
(SELECT cFROM xxx.AAAAWHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}'
) b
ON a.c = b.c
WHERE b.c is null
执行计划如下:
Filter is null(#391L)
+- 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 则更适合连接两个较大的表。但请注意,具体的性能取决于数据分布、硬件配置和数据库管理系统的优化能力。在实际情况中,优化器可能会根据统计信息和其他因素来选择最适合的连接算法。
相关文章:
Spark SQL优化:NOT IN子查询优化解决
背景 有如下的数据查询场景。 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.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通过查看SQL语句的执行计划基本…...
代码审计-java项目-组件漏洞审计
代码审计必备知识点: 1、代码审计开始前准备: 环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集: 审计目标的程序名,版本,当前环境(系统,中间件…...
接口测试的测试用例该怎么写呢
接口测试是软件测试中非常重要的一部分,因为接口的稳定性和可靠性对于整个系统的质量和用户体验都有很大的影响。在接口测试中,编写有效的测试用例是非常关键的一步。本文将介绍如何编写接口测试的测试用例,包括测试用例的设计和编写方法&…...
C语言例题讲解(if语句,循环语句,函数)
目录 if语句例题题目分析代码题目总结 循环语句例题题目分析代码题目总结 函数例题题目分析代码题目总结 if语句例题 计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值,打印出结果题目分析 1:首先我们不难看出算式中的加号和减号是交替出现的࿰…...
深入探索JavaEE单体架构、微服务架构与云原生架构
课程链接: 链接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取码: 4s99 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍: 🔍【00】模块零:开营直播&a…...
【STM32】FreeRTOS互斥量学习
互斥量(Mutex) 互斥量又称互斥信号量(本质也是一种信号量,不具备传递数据功能),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性…...
Docker容器基础
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Docker概述1、docker是什么2、Docker的设计宗旨3、容器在内核中支持2种重要技术: 三、Docker的核心概念四、Docker相关命令1.安装依赖包2.设置阿里云…...
Ajax及前端工程化
Ajax:异步的js与xml。 作用: 1、通过ajax给服务器发送数据,并获得其响应的数据。 2、可以在不更新整个网页的情况下,与服务器交换数据并更新部分网页的技术。 一、同步与异步 二、原生Ajax 1、准备数据地址 2、创建XMLHttpReq…...
electron的使用和操作
文章目录 先创建一个基本的electron应用electron生命周期事件 先创建一个基本的electron应用 先安装 npm install --save-dev electron然后在package.json里面创建如下内容 {"name": "my-electron-app","version": "1.0.0","d…...
Python最重要的数据结构是列表(list)的使用方法
列表是一种有序的集合,可以包含任意类型的元素,包括数字、字符串、布尔值、元组等。列表使用方括号[]来表示,元素之间用逗号,分隔。 以下是一些使用列表的例子: 1. 创建一个空列表: my_list []2. 创建一个包含元素的…...
二开ChatGPT微信小程序源码 AI聊天微信小程序源码 适配H5和WEB端 支持AI聊天次数限制
ChatGPT-MP是一款基于的微信小程序,同时适配H5和WEB端。它提供了前后台二开的能力,支持打字效果的流式输出,以及限制AI聊天次数和分享增加次数等功能。该开源版本仅供学习交流使用,禁止商业用途和倒卖。感谢大家的关注与支持!技术栈方面,我们使用了JDK8、SpringBoot、Vue…...
VGG简单学习
VGG简单学习 简单介绍 在AlexNet网络的基础上,为了设计深层神经网络,牛津大学设计了VGG网络,采用块的设计理念,将AlexNet中多个重复的卷积层和池化层组成一个块 论文中,使用3x3卷积核,padding1的卷积层 和带有2x2的汇…...
Stable Diffusion - 人物坐姿 (Sitting) 的提示词组合 与 LoRA 和 Embeddings 配置
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132201960 拍摄人物坐姿时,需要注意: 选择一个舒适和自然的坐姿,符合个性和心情。可以坐在椅子、沙发、长凳、…...
[oneAPI] 手写数字识别-GAN
[oneAPI] 手写数字识别-GAN 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolki…...
爬虫逆向实战(十五)--阿某某营登录
一、数据接口分析 主页地址:阿某某营 1、抓包 通过抓包可以发现登录接口是Users/Login 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个s加密参数 请求头是否加密? 无响应是否加密? 无cookie是…...
【计组】校验码(奇偶校验码、海明校验码、CRC)
前言 1、小提示:本篇博文是参考王道,在复习 ASCII 码的基础上,总结校验码的相关学习知识点,并在最后搭配习题(含408真题)进行巩固练习。(对重点内容进行划线、标色) 2、适用人群&…...
File Inclusion
File Inclusion 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含…...
函数性能探测:更简单高效的 Serverless 规格选型方案
作者:拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮,以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…...
嵌入式Linux Qt5 (C++)开发栏目概述
本栏目开始介绍Linux系统下的Qt C程序开发,资源是以嵌入式为切入点(现在Linux系统下的Qt C程序开发好像就是应用于嵌入式),那就跟着一起学习Linux系统下的Qt C程序开发知识,再扩展一下嵌入式的知识吧。我这里默认已经熟…...
C语言“牵手”微店商品详情数据方法,微店商品详情API接口申请指南
微店平台的商品详情通常包括以下信息: 商品名称:展示商品的名称,用于描述商品的特性和分类。 商品图片:展示商品的图片,可以有多张图片以展示不同角度和细节。 商品价格:显示商品的销售价格,可…...
intv_ai_mk11应用场景:技术团队内部知识沉淀助手、新人入职培训问答机器人
intv_ai_mk11应用场景:技术团队内部知识沉淀助手、新人入职培训问答机器人 1. 什么是intv_ai_mk11对话机器人 intv_ai_mk11是一款基于7B参数Llama架构的AI对话助手,专门为技术团队和新人培训场景设计。它运行在GPU服务器上,能够理解并回答各…...
中国信通院启动公文写作智能体评估,推动技术落地与规范发展
【导语:中国信通院在前期《智能体技术要求与评估方法》研制基础上,开展公文写作智能体技术规范编制,并联合多家单位共同参与。现正式启动首批评估工作,成果计划于2026年6月发布,将推动该技术落地与规范发展。】联合编制…...
MDXEditor指令系统详解:如何扩展Markdown语法
MDXEditor指令系统详解:如何扩展Markdown语法 【免费下载链接】editor A rich text editor React component for markdown 项目地址: https://gitcode.com/gh_mirrors/editor/editor MDXEditor是一个功能丰富的React组件,专为Markdown编辑设计&am…...
双项目驱动:AI教育轻创合伙人对比传统教育创业的显著优势
随着人工智能技术的飞速发展,AI教育正成为教育行业的新风口。在这一背景下,轻创合伙模式应运而生,为创业者提供了低门槛、高潜力的入局机会。本文将深入分析AI教育轻创合伙人相较于传统教育创业的核心优势,探讨其规模化路径的实现…...
从激光雷达到AI服务器:实战解析PCIe高速走线在车载与数据中心的不同设计策略
从激光雷达到AI服务器:实战解析PCIe高速走线在车载与数据中心的不同设计策略 在硬件设计领域,PCIe总线技术已经成为了高速数据传输的事实标准。从自动驾驶汽车的激光雷达到数据中心的AI加速卡,PCIe的身影无处不在。然而,看似相同的…...
AD5144A数字电位器I²C驱动库深度解析与工程实践
1. AD5144A数字电位器驱动库深度解析:面向嵌入式工程师的IC控制实践指南AD5144A是ADI公司推出的四通道非易失性数字电位器,属于AD51xx系列中功能完备、应用灵活的代表型号。该器件通过IC接口实现对四个独立通道的精确电阻调节,支持256级&…...
cv2.findContours()错误的解决办法ValueError: not enough values to unpack (expected 3, got 2)
方法一:直接去掉一个返回值就即可。 方法二:把OpenCV 安装3.X的版本 具体原因 2、解析差异: OpenCV2和OpenCV4中: findContours这个轮廓提取函数会返回两个值:①轮廓的点集(contours)②各层轮廓的索引(hierarchy) 返回…...
springboot+vue基于web的在线试题库考试系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计技术实现要点扩展功能建议安全注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块设计 后端(SpringB…...
springboot+vue基于web的在线投稿系统的设计与开发
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析审稿流程模块系统管理模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 用户管理模块 注册与登录…...
咱们今天聊点硬核但有趣的东西——用纳米级乐高积木(二氧化钛超表面)玩转光漩涡。想象一下,你手上有把能操控光波前形状的万能钥匙,这就是超表面的魅力所在
FDTD模型:基于超表面的完美涡旋光案例。 宽带任意阶 完美涡旋光束 介绍:全介质超表面实现完美矢量涡旋光束生成和完美庞加莱球生成,完美矢量涡旋光束不随拓扑荷的变化而变化,同时满足矢量光场的偏振变化,主要用于光学加密等领域&a…...
