第三篇 - 外键维表的关联:SPL轻量级文件存储提速查询实践

简介: SPL 重构关联计算,区分外键与主键关联,通过序号化、预加载和预关联实现高效运算。相比 SQL 笛卡尔积式 JOIN,SPL 利用关联本质优化存储与计算,显著提升性能,如案例中查询提速数十倍。

SQL 对关联的定义过于简单,就是两个表做笛卡尔积后再过滤,在语法上写成 A JOIN B ON …的形式。这样笼统处理多种关联,不体现关联运算本质,书写和优化都困难。

SPL 重新定义了关联。关联不再和笛卡尔积有关,而是分成两种情况:外键关联和主键关联。SPL 用不同的函数来计算不同的关联,体现关联运算本质。这样就可以利用不同关联的特征,采用不同的手段甚至不同的存储方式有效提速。

关联的一种情况是外键关联。一个表的普通字段(外键)和另一个表的主键关联。比如订单表与客户表、运货商表都是外键关联。

a137c53ac682c37de9d1fdd25189df79_1749006572362100.png
外键在关联表中是主键,具有唯一性,SPL 把外键理解成一个对象。

要注意,这里说的是逻辑上的主键,是在表中取值唯一的字段,不一定是在物理表上建立的 primary key。外键也不一定是物理上的 foreign key。

另一种关联是主键关联。用一个表的主键,关联另一个表的主键或部分主键。比如订单表的主键订单号,关联明细表的部分主键订单号。
7e4fa526b252a8106906f515322f7cce_1749006572434100.png
SPL 把主键关联看作记录对象或记录集合之间的连接。

这里要“敲黑板、划重点”啦:使用 SPL 编程实现关联,最重要的是要先识别关联类型!只有识别了关联的类型,才能选择相应的方法实现。识别的时候,重点要看主键在连接中的作用!

下面,我们以订单表、客户表、城市表、州表和运货商表为例,介绍 esProc SPL 外置数据提速外键关联的方法。

使用 ETL 工具定义 Q3.etl,拖拽需要的表:
2f372e66fda7406158d6158df431bd59_1749006572499100.png
比较大的 orders 是事实表,转储成 CTX。较小的维表转成 BTX,编程更方便。

定义关联字段序号化,比如 customer 中的 city_id,转维表 city 中的序号。

04cfb6bbcfccd906cdebcb52f1da9e18_1749006572590100.png
双击表达式 / 序号化表空白处—选择 city 表。city 表的 state_id,要类似的设置成 state 表。

修改 orders 表名为 ordersQ3(区别前面的表 ):
aaa814c169a2d4f3770cba1f13a84272_1749006572670100.png
employee_name 没有维表,要在 ordersQ3 表中找全所有值,新建维表 employee:
e27ff08981920c4c16ea9ea152071c7a_1749006572755100.png
上图的操作顺序:1、点击序号化枚举列。2、双击 employee_name。3、定义维表名 employee。4、定义维表序号列名称 id。5、定义维表值列名称 name。

还要设置 ordersQ3 中的序号化字段:
5e8b263b00e3aaa139c803d2e0940793_1749006572870100.png
生成 SPL 代码 14:导出数据,转储成 BTX 或 CTX。
image.png
A13 中,customer 表的 city_id,用 pfind 函数转为维表 city 中的序号:

af462835ed9807329d4240e5e4fd55ea_1749006572969100.png
SPL 代码 15:在系统启动,或数据有变动时执行初始化。
image.png
初始化完成预加载,预先把维表读入内存,用 env 存成全局变量。

还要完成预关联,预先把外键用 run 转换成对应维表的记录,比如 A6:

ed1c8d8298a7012320e303ab96dc37e3_1749006573109100.png
序表 customer 的普通字段 city_id 被转换为 city 表的记录。

数据转储、初始化完成后,可以实际计算,比如下面的例子:

例 3.1 某州订单,按运货商分组统计运费,结果包括运货商名。

SQL 这样写:

select shipper.shipper_id, shipper.shipper_name,sum(o.shipping_fee)
from 
    orders o
join 
    customer c on o.customer_id = c.customer_id
join 
    city on city.city_id = c.city_id
join 
    state on state.state_id = city.state_id
join 
    shipper on o.shipper_id = shipper.shipper_id
where 
    state.state_name = 'California'
group by 
    shipper.shipper_id, shipper.shipper_name;

执行时间是 20 秒。

SPL 代码 16:
image.png
A2 中 customer_id:customer:# 的写法,是利用序号 #,在游标上完成订单记录与客户表的关联。关联后, customer_id 和 shipper_id 字段都被转换为对应表的记录对象。

由于维表已经在初始化时预先关联好了,A3 就可以采用对象属性的方式写代码: customer_id.city_id.state_id.state_name。

执行时间是 0.4 秒

例 3.2 按客户所在城市分组统计订单数量,结果要包含州名称、城市名称。

select city.city_id,city.city_name,state.state_name,count(o.order_id)
from 
    orders o
join 
    customer c on o.customer_id = c.customer_id
join 
    city  on c.city_id = city.city_id
join 
    state on city.state_id = state.state_id
group by 
    city.city_id,city.city_name,state.state_name;

执行时间:22 秒。

SPL 代码 17:在前面代码 SPL 代码 16 基础上,改一下 A4 就可以了。

image.png
执行时间是 0.3 秒。

小结一下性能(单位 - 秒):
image.png
请动手练习一下:

1、找出运货商是 Elite Shipping Co. 的订单,按客户所在州分组统计运货费。结果要包括州名称。

2、思考:在自己熟悉的数据库中有没有通过外键关联的多个表?是否可以用序号关联的方法来提速?

相关文章
|
4月前
|
存储 SQL 算法
第四篇 - 大主子表关联--SPL轻量级文件存储提速查询实践
本文介绍如何通过有序归并算法加速主键关联计算。将订单表与明细表按主键有序存储,利用esProc SPL实现高效归并,显著提升大表JOIN性能。实测案例显示,原需21-40秒的SQL查询,SPL仅需0.6-1.5秒,提速数十倍。
SQL 存储 缓存
188 1
|
5月前
|
SQL 并行计算 关系型数据库
第一篇 - 常规过滤及分组汇总:SPL轻量级文件存储提速查询实践
本文以订单表为例,介绍如何使用 esProc SPL 实现数据外置,提升过滤与分组汇总计算效率。通过 SPL 的 ETL 工具导出数据为 BTX 与 CTX 格式,并利用游标、列存、并行计算等技术逐步优化性能,最终执行时间从 MySQL 的 11 秒降至 0.5 秒。适用于处理大数据量、历史数据的高性能分析场景。
|
9月前
|
SQL 存储 OLAP
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
传统交易型数据库在分析计算中常遇性能瓶颈,将数据迁至OLAP数据仓库虽可缓解,但成本高、架构复杂。SPL通过轻量级列存文件存储历史数据,提供强大计算能力,大幅简化架构并提升性能。它优化了列式存储、数据压缩与多线程并行处理,在常规及复杂计算场景中均表现优异,甚至单机性能超越集群。实际案例中,SPL在250亿行数据的时空碰撞问题上,仅用6分钟完成ClickHouse集群30分钟的任务。
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
|
存储 固态存储 文件存储
并行文件存储在大模型训练中的探索与实践
阿里云智能集团存储产品专家何邦剑分享了并行文件存储CPFS在大模型训练中的应用。CPFS针对大模型训练的IO特点,优化性能、降低成本、提升用户体验。它支持多计算平台共享访问,具备数据分层存储、生命周期管理、缓存加速等特性,实现高效的数据处理与管理,显著提升训练效率和资源利用率。尤其在大规模集群中,CPFS提供了高吞吐、低延迟及灵活扩展的能力,助力客户如零一万物实现高性能训练。
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
|
缓存 监控 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
|
4月前
|
存储 人工智能 运维
阿里云渠道商:如何开通阿里云文件存储?
阿里云文件存储NAS支持NFS/SMB协议,实现多节点共享访问,适用于企业应用、AI计算与云备份。具备高可靠、零运维、弹性扩展及低成本优势,无缝集成OSS与本地IDC。
|
存储 NoSQL 文件存储
云计算问题之阿里云文件存储CPFS如何满足大模型智算场景的存储需求
云计算问题之阿里云文件存储CPFS如何满足大模型智算场景的存储需求
279 2
|
存储 弹性计算 监控

热门文章

最新文章