SQL如何利用Bitmap思想优化array_contains()函数

news2024/11/20 8:36:13

目录

0 问题描述

1 位图思想

2 案例实战

3 小结


0 问题描述

在工作中,我们往往使用array_contains()函数来进行存在性问题分析,如判断某个数是否在某个数组中,但是当表数据量过多,存在大量array_contains()函数时,就会存在一定性能问题,为了优化该函数的性能,本文主要利用位图的方法来代替array_contains()函数。

1 位图思想

   在本文之前读者需要先了解位图的概念及位图的一些性质,本文关于位图的概念不再重复。假如我们有如下需求,如下图所示,我们想判读数字2,5,7是否在数组[1,2,3,5,6]中时,如果用位图我们应该怎么做?通过两个位图相与就可以求出交集,通过下图可以看出bitmap1&bitmap2,可以求出交集2和5在数组中,因此关于此性质,我们可以得到判读存在性问题时,我们只需要构建两个位图与,结果有值不为0则为存在,那么问题来了,如何通过SQL的形式去构建呢?

   

相比大家对8421码比较熟悉,如1111,如下图所示

上述的式子我们可以进行如下等价

1111=15=1*2^0 + 1 * 2^1  +  1 * 2^2 +  1 * 2^3 <=> 1 << 0 + 1 << 1 + 1 << 2  + 1 << 3

因此我们构建数组 [1,2,3,5,6] 在位图中反应即为:

存在记为1,不存在记为0,即序列 01101110

那我们如何用SQL语言反应上述表达式呢?根据前面的等价转换,我们知道要反应01101110序列

即为:01101110=1*2^1 + 1*2^2 + 1*2^3 + 1*2^5 + 1*2^6 = 1 << 1 + 1 << 2 + 1 << 3 + 1 << 5 + 1 << 6。因此只要我们数据库中支持位移运算,就可以等价上述表达式。那么我们怎么判断数字2是否在上述数组中呢?数字2的位图根据以上推导,我们可以很快得出 1 << 2,而是否存在,只需要两者之间进行与运算即可,即:(1 << 2) &( 1 << 1 + 1 << 2 + 1 << 3 + 1 << 5 + 1 << 6),计算过程如下:

   01101110
&  00000010
————————————————
   00000010    =2

 

 总结上述规律,我们得出如下判断公式:

假设判断某个num是否在数组[a,b,c,d]中时,可用如下公式:
if{

   (1 << num) & (1 << a + 1 << b  + 1 << c + 1 << d) = num
   then true
   else false

};

上述操作对应不同数据库操作符不一样,如何hive中使用shiftleft函数,doris中采用bit_shift_ left()函数,greenplum中直接为 <<操作符。

2 案例实战

如下2张表tbl1,tbl2,假设表数据量很大,判断tbl2中的col1字段是否在表tbl1中对应的id num字段中。

具体SQL如下:

select  t1.id
       , col1
       ,case when (1 << col1) & num ) = col1 then true else false end true_or_false_flg

from tbl1 t1
left join
(
 select id ,sum(1 << num) num
 from tbl2
 group by id 

) t2
on t1.id = t2.id

读者在遇到相关问题时,可以根据自己具体的场景进行等价变换,这里只是抛砖引玉说明具体使用方法、

3 小结

  本文主要阐述了如何利用位图思想优化array_contains()函数的方法,在具体业务中得到了较好的性能提升,当表数据量比较大,且利用array_contains()函数比较多时候,性能提升明显,利用计算机底层位移运算减少了开销。

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

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

相关文章

PHP定时任务框架taskPHP3.0学习记录7宝塔面板手动可以执行自动无法执行问题排查及解决方案(sh脚本、删除超过特定天数的日志文件、kill -9)

PHP定时任务框架taskPHP3.0学习记录 PHP定时任务框架taskPHP3.0学习记录1&#xff08;TaskPHP、执行任务类的实操代码实例&#xff09;PHP定时任务框架taskPHP3.0学习记录2&#xff08;环境要求、配置Redis、crontab执行时间语法、命令操作以及Screen全屏窗口管理器&#xff0…

无缝对接配电自动化:IEC104转OPC UA网关解决方案

随着水电厂自动化发展的要求&#xff0c;具有一定规模的梯级水电站越来越多&#xff0c;为了实现水电站的无人值班(少人值守)&#xff0c;并考虑到节能控制&#xff0c;电厂采用了集中监控。集中监控关注的是整个电网的安全稳定运行及电压、频率和整个电网的电力需求&#xff0…

中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域&#xff0c;高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…

好看流光风格个人主页源码下载

这是一款美观流光作风个人主页HTML源码&#xff0c;觉得挺喜欢的&#xff0c;需求的自行下载&#xff01; 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89105857 更多资源下载&#xff1a;关注我。

JAVA前端快速入门基础_javascript入门(02)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 1.JavaScript函数 什么是函数:执行特定任务的代码块 1.1定义&#xff1a; 使用function来进行定义(类似于python里面的def 或者java和c里面的void&#xff0c;int这些返回类型开头)。定义规则如下: func…

开源、轻量、易用的服务器实时监控工具:哪吒探针

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 哪吒探针是一个开源、轻量、易用的服务器监控、运维工具&#xff0c;它有以下几个特点&#xff1a; 一键安装&#xff1a;可以一键安装面板与 Agent&#xff0c;并且支持 Linux、Windows、MacOS、OpenWRT…

【HMGD】使用CubeMx配置GD32F303系列单片机进行DMA ADC

原理图查看 查原理图可以看到GD32F103C8T6的官方开发板GD32303C-START-V1.0的PA1没有接任何东西 使用PA1作为ADC端口 CubeMX配置ADC和时钟 配置ADC通道 启用循环模式 配置此通道ADC分频 配置ADC DMA为循环模式 配置时钟 可根据手册配置最大HZ GD32F303最高频率设定 生成…

使用SDRPI运行openwifi和设置网口

目录 一 制作启动盘 二 使用串口的方式启动openwifi 三 无线连接 四 网口设置&#xff0c;有线连接 五 使用SSH登录 一 制作启动盘 在github上下载img文件&#xff0c;由于github上下载速度比较慢&#xff0c;我会上传网盘链接 githun下载img文件地址: https://git…

【Schrödinger薛定谔软件使用实战】- 4lyw蛋白实战

文章目录 软件选择1 pretein preparation1.1 import and process注意1.1.1 preprocess可能遇到的问题 1.2 review and modify1.3 refine1.3.1 optimize优化氢键网络1.3.2 minimize 氢原子会进行能量最小化 2 ligand prepare3 生成对接盒子-receptor grid generation3.1 recepto…

假设检验随想

⭐️ 前言 你会吵架吗&#xff1f;你会用数学吵架吗&#xff0c;不会的话就过来看看吧&#xff0c;哈哈 西方人发明了现代意义上的概率论&#xff0c;于是就想把它推广到生产和生活中。借助一大堆的概率论中的概念&#xff0c;他们发明了假设检验&#xff0c;想利用有限的数据…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

在线听歌播放器 梨花带雨网页音乐播放器 网页音乐在线听 源码

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 下 载 地 址 &#xff1a; runruncode.com/php/19749.html 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&am…

开启HIVE JDBC连接

开启HIVE JDBC连接 没有人能替你承受痛苦 也没有人能抢走你的坚强 目录 开启HIVE JDBC连接 1.开启命令 2.连接命令 3.hive连接jdbc报错 4.查看服务是否启动 》》》》》》开启HIVE JDBC连接《《《《《《 1.开启命令 hive --service hiveserver2 2.连接命令 beeline -u j…

动静态库(完结版)

文章目录 接上篇完成blog第三方库安装演示动态库加载原理一二三四 接上篇完成blog 上篇链接 第三方库安装演示 sudo yum install -y ncurses-devel下载完成之后 在系统目录下面一定能找到对应的头文件和库文件 此时使用第三方库: 编译之后按错误提示是对应的函数找不到,所以链…

Gitlab安装部署

Gitlab安装部署 一、下载对应的安装包 查看Linux系统的版本信息 cat /proc/version查看Linux系统发行版信息 cat /etc/redhat-release然后下载匹配版本的 gitlab&#xff0c;因为 gitlab 官网下载比较缓慢&#xff0c;所以这里附带了清华的镜像 Index of /gitlab-ce/yum/e…

Django后台项目开发实战一

开发环境使用 Anaconda, IDE 使用 pycharm 第一阶段 创建 Django 项目 在 Anaconda Prompt 中逐步输入下面的命令&#xff08;之后的所有命令都在这个&#xff09; 首先创建一个虚拟环境&#xff0c;名称自拟&#xff0c;python 版本我这里使用 3.9.18 关于 python 版本和…

【补充】图神经网络前传——图论

本文作为对图神经网络的补充。主要内容是看书。 仅包含Introduction to Graph Theory前五章以及其他相关书籍的相关内容&#xff08;如果后续在实践中发现前五章不够&#xff0c;会补上剩余内容&#xff09; 引入 什么是图&#xff1f; 如上图所示的路线图和电路图都可以使用…

Spring Security介绍(二) 主要组件(1) SecurityConfigurer

一、介绍 1、介绍 SecurityConfigurer 在 Spring Security 中是一个非常重要的角色。在前面的内容中曾经多次提到过&#xff0c;Spring Security 过滤器链中的每一个过滤器&#xff0c;都是通过 xxxConfigurer 来进行配置的&#xff0c;而这些 xxxConfigurer 实际上都是 Secu…

TCP通信 ,客户端服务端流程

TCP通信 TCP&#xff1a;传输层协议 特点&#xff1a;面向连接的安全的流式传输协议 面向链接 &#xff1a; 连接&#xff1a;三次握手&#xff0c;建立双向链接 断开&#xff1a;四次挥手&#xff0c;双向断开 安全的&#xff1a;通信过程会对通信进行校验&#xff0c;判…

Linux详解:进程创建

文章目录 进程创建fork函数写时拷贝页表fork常规用法fork调用失败的原因 进程创建 fork函数 在linux 中fork函数&#xff0c;它从已经存在的进程中创建一个新的进程&#xff0c;新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h> pid_t fork(void);返…