论文导读 | 数据库中的连接操作

1. 连接操作的背景与问题定义

在关系型数据库中,我们通常面对以下问题: 给定一个数据库实例 I \mathcal{I} I,包含若干关系(表) R = { R 1 , R 2 , ⋯ , R n } \mathcal{R}=\{R_1, R_2, \cdots, R_n\} R={R1,R2,,Rn} 和属性集合 A = { a 1 , a 2 , ⋯ , a m } \mathcal{A}=\{a_1, a_2, \cdots, a_m\} A={a1,a2,,am},如何高效地计算连接结果 Q = R 1 ⋈ R 2 ⋈ ⋯ ⋈ R n Q = R_1 \bowtie R_2 \bowtie \cdots \bowtie R_n Q=R1R2Rn

在这个问题中,我们仅考虑等值连接。在实际应用中,我们可以通过下推选择操作、得到结果之后再执行投影和聚合的方式,将含有选择、投影和聚合的复杂查询划归到连接查询上。

由于执行过程中会产生大量中间结果,因此需要仔细选择合适的执行计划(包括连接顺序)和连接算法,重点在于减少不必要的中间结果和计算代价。

2. 连接操作的经典方法

2.1 二元连接(Binary Join)

这是最常用的连接方法,适用于两个关系表的连接。实现方式包括嵌套循环连接(nested loop join)、块嵌套循环连接(Block Nested Loop Join)、哈希连接(Hash Join,在小表上建立 hash 表,对于大表的每一条元组探查 hash 表,查看是否存在满足连接条件的结果)和排序-合并连接(Sort-Merge Join,先对数据排序,再通过合并实现连接)等方式。

虽然这些方法简单且直观,但在处理复杂查询和多表连接时,可能会产生性能瓶颈。

2.2 Yannakakis 算法(适用于无环查询)

对于无环查询(acyclic queries),Yannakakis算法[1]可以达到最优复杂度。其分为两个阶段:

  • 自底向上的半连接(Bottom-up Semi-Join):逐步减少数据规模。
  • 自顶向下的半连接(Top-down Semi-Join):递归计算最终结果。
    通过自底向上的半连接,可以保证后续自顶向下的连接中,每一条来自上层的元组,都能产生最终的连接结果,从而避免悬空元组(dangling tuple)带来的高代价。

3 最优连接算法

3.1 AGM 上界

如下图所示,考虑三角形连接查询 Q = R ( a , b ) ⋈ S ( b , c ) ⋈ T ( c , a ) Q=R(a, b)\bowtie S(b, c)\bowtie T(c, a) Q=R(a,b)S(b,c)T(c,a) ,若每个表的大小都为 N N N,无论采用何种二元连接,在中间步骤连接任意两个表时,最坏情况下会产生 N 2 N^2 N2 的中间结果,而此三角形查询最坏情况下能产生的结果数目仅为 N 1.5 N^{1.5} N1.5[2]。所以二元连接在某些情况下,会产生过多的中间结果。

给定连接查询里每个表的基数(元组数量)时,AGM 上界[2]给出了所有满足该基数限制的数据库实例中,能够产生最多连接结果的数量,其可以通过超图和线性规划的方法求出。

值得注意的是,AGM上界仅为最坏情况下连接结果的大小,尽管这是个紧的上界(可以构造出数据库实例,产生出这么多数量的连接结果),但具体到某个实例上,最终的结果数量可能远小于该上界。

3.2 最坏情况最优连接(Worst-Case Optimal Join, WCOJ)

传统的二元连接算法并不能保证在最坏情况下达到最优性能。而 WCOJ 算法则通过逐属性连接的方法,每步骤产生的中间结果数量都不会超过对应子查询的 AGM 上界,从理论上保证了最坏情况下的时间复杂度最优。

典型算法:
  • NPRR算法[3]
    首次提出了最坏情况最优连接的概念。NPRR 通过将属性值分类为“轻节点”和“重节点”,对重节点进行特殊处理(采用检查策略而非连接策略),从而避免了不必要的计算。 后续工作 Generic Join[4] ,拓展了 NPRR 算法,不必再将属性值分类,而直接每次连接一个属性,便可达到最坏情况最优的性质。
  • Leapfrog Triejoin算法[5]
    这是一个简单且高效的WCOJ算法,主要利用了对单属性的蛙跳求交算法(leapfrog join)。

4 最新的研究与优化方向

4.1 Lookup & Expand

该工作[6]将一个连接操作拆分为**查找(Lookup)扩展(Expand)**两步:

  • 查找:找到第一个匹配项。
  • 扩展:生成剩余的匹配结果。

这种方法的好处在于:可以将查找操作下推,尽早发现无法匹配的中间结果,提前终止对这些中间结果的执行。作者还发现,对于实际应用的查询,采用该分解框架,仅用二元连接和三元连接便可在大部分查询上达到较好的性能。该论文还提出了根据两个启发式规则和代价模型,选择实际执行计划的策略,具体可以参考该论文对应的技术报告[7]

实验结果也展现了其方法的优越性。
在这里插入图片描述

4.2 Free Join

与一般的 WCOJ 的 Trie 树实现方式不同,Free Join[8]利用**拓展哈希树(generalized hash trie, GHT)**来组织数据。其执行包含构建和连接两步骤。在其框架中,可以将任意二元连接计划转化为一个利用 GHT 执行的计划,随后采用若干启发式规则,下推查找进行优化。实际执行时,还可以采用延迟模式构建 GHT 以及向量化操作等方式进一步优化性能。在常见基准上,该方法展现了较好性能。

5 连接操作在图查询中的应用

在图查询中,连接操作通常用于子图匹配问题,给定查询图的节点顺序,便可根据该顺序,一次连接一个节点。下面两个子图匹配算法中也蕴含了上面连接操作的优化思想:

  1. **NewSP算法[9]:**通过延迟Expand操作,在有匹配结果的时候,能够减少中间结果,提高匹配效率。
  2. **VEQ算法[10]:**提前处理一度查询顶点的连接操作,提前发现不能产生匹配结果的情况,减少无用操作。

6 总结

连接操作是数据库系统的核心部件之一,从传统的二元连接到最坏情况最优连接,再到最新的Lookup & Expand和Free Join方法,连接算法在性能和可扩展性上不断取得突破。但这些方法的思想内涵都是一致的,总结为以下三点:

  • 尽管任何一种连接顺序在WCOJ执行下都能保证最坏情况最优性,但具体到每一个实例上,执行效率差别会很大。
  • 提前检查,延后拓展,减少无用中间结果。
  • 合并某些操作会带来收益。

参考文献

[1] Algorithms For Acyclic Database Schemes. Mihalis Yannakakis. VLDB 1981.

[2] Size Bounds and Query Plans for Relational Joins. Atserias Albert, Martin Grohe, and Dániel Marx. Proceedings of the 2008 49th Annual IEEE Symposium on Foundations of Computer Science. 2008.

[3] Worst-case Optimal Join Algorithms. PODS 2012. Hung Q. Ngo, Ely Porat, Christopher Ré, Atri Rudra

[4] Skew Strikes Back: New Developments in the Theory of Join Algorithms. SIGMOD Record 2014. Hung Q Ngo, Christopher Ré, and Atri Rudra.

[5] Leapfrog triejoin: A simple, worst-case optimal join algorithm. Todd L. Veldhuizen. ICDT, 2014.

[6] Robust Join Processing with Diamond Hardened Joins. Altan Birler, Alfons Kemper, and Thomas Neumann. VLDB 2024.

[7] Technique report. https://mediatum.ub.tum.de/1732739?show_id=1736607.

[8] Free Join: Unifying Worst-Case Optimal and Traditional Joins. Yisu Remy Wang, Max Willsey, and Dan Suciu. SIGMOD 2023.

[9] NewSP: A New Search Process for Continuous Subgraph Matching over Dynamic Graphs. ICDE 2024. Ziming Li, Youhuan Li, Xinhuan Chen, Lei Zou, Yang Li, Xiaofeng Yang, Hongbo Jiang.

[10] Versatile Equivalences: Speeding up Subgraph Query Processing and Subgraph Matching. SIGMOD 2021. Hyunjoon Kim, Yunyoung Choi, Kunsoo Park, Xuemin Lin, Seok-Hee Hong, Wook-Shin Han.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上,实例是别的同事搭建的。最近又又又想了解一下,而且已经盘了一些了,所以写写记录一下。因为这个事儿没太多的进度压力,索性写到哪儿算哪儿,只要是新了解到的…

【搜索】【推荐】大 PK

引言 在当今信息爆炸的时代,如何从海量数据中精准地为用户推荐最相关的内容成为了科技领域的关键挑战。搜推技术作为推荐系统的核心组件,扮演着至关重要的角色。本文将深入探讨这两种技术背后的方法论,剖析它们各自面临的难点,并…

多模态大模型初探索:通过ollama部署多模态大模型

文章目录 前言模型下载 前言 今天和同事聊天,聊到多模态大模型,感觉可以作为2025年的一个新的探索方向。希望和大家一起学习,一起进步。 今天也是尝试了我能想到的最基本最快速地本地部署多模态大模型的方式,那便是使用ollama。…

maven如何从外部导包

1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

流媒体内网穿透/组网/网络映射EasyNTS上云网关启动失败如何解决?

在当今的网络视频监控和远程通信领域,设备的远程访问和数据共享需求日益增长。通过EasyNTS平台,用户无需开放内网端口,即可实现内网应用的外网访问,极大地简化了网络配置和维护工作。 EasyNTS上云网关的主要作用是解决异地视频共…

力扣刷题:数组OJ篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.轮转数组(1)题目描述…

flink cdc oceanbase(binlog模式)

接上文:一文说清flink从编码到部署上线 环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。 预研初衷:现在很多项目有国产化的要求&#…

【Web】0基础学Web—事件对象、事件委托(事件代理)——星级评论案例

0基础学Web—事件对象、事件委托(事件代理)——星级评论案例 事件对象关闭鼠标右键的点击事件关闭鼠标滚轮的事件点击的目标对象点击鼠标的左键0 滚轮1 右键2获得被点击的节点的名称或取相对于浏览器左上角的距离(会受页面滚动条的影响&#…

el-table 多级表头

1.结构 <el-table:data"tableData"border:height"700"style"width: 100% !important; overflow: auto":header-cell-style"{ background: #becee1, color: #333 }":cell-style"{ padding: 5px }"><template v-for…

计算机网络基础——网络协议

""" 资料的搬运工 """ 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。 1、网络层次划分 OSI七层网络模型 1&#xff09;物理层 确保原始的数据可在各种物理媒体上传输 中继器&#xff08;放大器&#xff09;和集…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了&#xff08;具体哪些是必须的&#xff0c;哪些是多余的没验证&#xff09;&#xff0c;configure才能认为X的库文件和头文件是可以用的。打开多个编程语言的支持特性。 ./configure --prefixpwd/mybui…

Numpy数组的属性

NumPy中最重要的一个特点就是其n维数组对象&#xff0c;即ndarray(别名array)对象&#xff0c;该对象具有矢量算术能力和复杂的广播能力&#xff0c;可以执行一些科学计算。不同于Python内置的数组类型&#xff0c; array对象拥有对高维数组的处理能力&#xff0c;这也是数值计…

如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01;点击&#xff01;点击&#xff01; ⏰️创作时间&#xff1a;2025年1月8日8点14分…

ProtonBase 荣获 Datafun “数智技术最佳探索奖”

2024年&#xff0c;数智领域迎来技术创新的高峰&#xff0c;尖端技术和用户案例呈现井喷式增长&#xff0c;成为引领时代潮流的关键词。DataFun 社区作为数智前沿阵地&#xff0c;汇聚全球数智精英&#xff0c;推动技术革新和知识共享&#xff0c;助力技术加速发展。 由 DataFu…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题&#xff1a;用豆包MarsCode IDE&#xff0c;从0到1画出精美数据大屏&#xff01; 豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

/src/utils/request.ts:axios 请求封装,适用于需要统一处理请求和响应的场景

文章目录 数据结构解释1. 核心功能2. 代码结构分析请求拦截器响应拦截器 3. 改进建议4. 总结 console.log(Intercepted Response:, JSON.stringify(response));{"data": {"code": 0,"msg": "成功","data": {"id":…

LabVIEW调用不定长数组 DLL数组

在使用 LabVIEW 调用 DLL 库函数时&#xff0c;如果函数中的结构体包含不定长数组&#xff0c;直接通过 调用库函数节点&#xff08;Call Library Function Node&#xff09; 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配&#xff0c;而包含不定长数…

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …

深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02

目录 2、 使用SurfaceView画2D图 范例一 设计GameLoop(把小线程移出来) 范例二 2、 使用SurfaceView画2D图 范例一 以SurfaceView绘出Bitmap图像设计SpriteView类别来实作SurfaceHolder.Callback接口首先来看个简单的程序&#xff0c;显示出一个Bitmap图像。这个图像就构…

Redis Java 集成到 Spring Boot

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…