数据蒋堂 | JOIN提速 - 外键指针的衍生

简介:

当数据量大到无法全部放进内存时,前述的指针化方法就不再有效了,因为在外存无法保存事先算好的指针。

一般来讲,外键指向的维表容量较小,而不断增长的事实表要大得多。如果内存还能把维表放下的话,我们可以采用临时指向的方法来处理外键。

9b36cc3d122b89c8d9e78c699f6420f842187c6b

前两步与全内存时相同,第4步的指针转换是边读入边进行的,而且转换结果无法保留复用,下次再做关联时还要再计算HASH和比对,性能要比全内存的方案差。计算量方面,比HASH分段方案少了一次维表的HASH值计算,这个维表如果经常被复用时会占些便宜,但因为维表相对较小,总体优势并不算大。不过,这个算法同样具有全内存算法可以一次解析全部外键以及易于并行的特点,在实际场景下比HASH分段算法仍有较大的性能优势。

在这个算法基础上,我们还可以做个变种:外键序号化

如果我们能把维表的主键都转换成从1开始的自然数,那么我们就可以用序号直接定位维表记录,就不需要计算和比对HASH值,这样就可以获得类似全内存下指针化的性能了。

b64e0879eb1d133d68d8634642ff34212b84a23e

序号主键的维表不再需要原来建HASH索引的第2步。

外键序号化本质上相当于在外存实现指针化。这种方案需要把事实表中的外键字段转换成序号,这类似在全内存运算时建立指针的过程,这个预计算也可以得到复用。需要注意的是,维表发生重大变化时,需要同步整理事实表的外键字段,否则可能对应错位。不过一般维表变化频度低,而且大多数动作是追加和修改而非删除,需要重整事实表的情况并不多。

SQL使用了无序集合的概念,即使我们事先把外键序号化了,数据库也无法利用这个特点,不能在无序集合上提供用序号快速定位的机制,只能使用索引查找,而且数据库并不知道外键被序号化了,仍然会去计算HASH值和比对。

如果维表也大到内存装不下呢?

我们仔细分析上面的算法会发现,过程中对于事实表的访问是连续的,但对于维表的访问是随机的。我们以前讨论硬盘的性能特征时谈到过,外存不适合随机访问。如果把维表放在外存中再执行上面的算法,那性能会差到远不如HASH分段算法的地步,甚至赶不上把两个表排序后再做归并的性能。

这时候我们要借助集群的力量了。

一台机器的内存装不下,可以多搞几台机器来装下,把维表分段放在多台机器上形成集群维表,然后就可以继续使用上面的算法并获得一次解析多个外键和易于并行的好处。同样地,集群维表也可以使用序号化的技术。

需要注意的是,内存不仅适合随机访问,还适合小量频繁访问。而集群维表虽然是内存存储的,但中间多了网络传输,而网络却不适合小量频繁访问。这时,在遍历事实表时就不能像单机时那样每次只处理一条记录,而需要批量读取一批记录,把它们需要JOIN的键值聚集起来再发送到目标集群节点去获取维表的相关字段。

保证维表的内存化是提高性能的关键因素。对于现代计算机的内存容量而言,大部分维表在单台机器的内存都可以放下,少量巨大维表则采用集群维表来处理,这样可以确保对维表的高性能随机访问。如果真地出现连集群也装不下的维表,那可能还是只能回到低效的HASH分段算法了。


原文发布时间为:2017-12-15

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关文章
|
1月前
|
C语言
指向指针数据的指针变量
指向指针数据的指针变量
10 0
|
8天前
|
存储 搜索推荐 C语言
运用指针轻松实现多个数据排列
这段内容介绍了一种使用PLC编程进行数据排序的方法,特别是通过冒泡排序算法来实现。文中以一个包含5个数字(90, 21, 132, -58, 34)的序列为例,详细解释了排序过程,包括多轮比较和数据交换。在每一轮中,最大的数字会移动到右侧。通过嵌套的FOR循环结构实现程序逻辑,其中外层循环控制轮次,内层循环处理每轮的比较和交换。最终,程序能够将序列从小到大排序。
22 6
|
1月前
|
分布式计算 Hadoop Java
Flink CDC产品常见问题之tidb cdc 数据量大了就疯狂报空指针如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
4月前
指向结构体类型数据的指针
指向结构体类型数据的指针。
29 3
|
5月前
【指针的进阶(3)】回调函数和qsort排序各种类型的数据
【指针的进阶(3)】回调函数和qsort排序各种类型的数据
34 0
|
5月前
|
机器学习/深度学习 存储 人工智能
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
73 0
|
9月前
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
|
10月前
|
SQL 数据库
springboot+mybatis,mapper调用查询的数据为空,报空指针异常
springboot+mybatis,mapper调用查询的数据为空,报空指针异常
704 0