第四篇 - 大主子表关联--SPL轻量级文件存储提速查询实践

简介: 本文介绍如何通过有序归并算法加速主键关联计算。将订单表与明细表按主键有序存储,利用esProc SPL实现高效归并,显著提升大表JOIN性能。实测案例显示,原需21-40秒的SQL查询,SPL仅需0.6-1.5秒,提速数十倍。

这一篇介绍主键关联的提速。

主表订单表和子表明细表的关联就是主键关联。SQL 中,这种关联仍用 JOIN 实现,在两个表都很大的情况下,常常出现计算速度非常慢的现象。

如果预先将主子表都按照主键有序存储,就可以使用归并算法实现关联。这种算法只需要对两个表依次遍历,不必借助外存缓存,可以大幅降低计算量和 IO 量。

esProc SPL 支持有序归并算法,可以大幅提升主子表关联计算性能。

先做数据准备,把历史数据从数据库导出为 CTX 文件。在 ETL 中定义 Q4.etl:
586034c4667143291030f16d8a6fcafe_1749006573198100.png
修改两个表的名字,加上 Q4。

detailsQ4 表按照首字段分段:
ff233b372de57115b5e48ac76bcaa592_1749006573266100.png
detailsQ4 表中的 order_id 不唯一,要声明第一个字段是分段键。

防止分段读取时,把某个 order_id 的记录拆分到两段。SPLX 中 create 会自动加 p 选项。

注意:两表要按照 order_id 连接,就按照这个字段有序存储。但不选中“用数据库排序”。

生成 SPL 代码 18:
image.png
A5和 A8 中用 #order_id 来声明 CTX 是对这个字段有序的。

在 details 表中,A8 自动给 create 函数加 @p 选项,表示第一个字段是分段键。防止分段读取时,把某个 order_id 的记录拆分到两段。

例 4.1 指定日期范围,按照客户分组统计订单金额。

select
o.customer_id,sum(d.quantity * d.price)
from
orders o
join
details d on o.order_id = d.order_id
where o.order_date>='2024-01-15'
and o.order_date<='2024-03-15'
group by o.customer_id;
执行时间 25 秒。

SPL 代码 19:

image.png
执行时间 1 秒

A3 中游标的最后一个参数是 A2,表示多线程并行时,details 表会跟随 orders 表分段,保证后面两个表有序归并的正确性。

A4 中 orders 和 details 有序关联归并。

A5 对归并的结果分组汇总。

重点注意 A4:

5102dcc8ddb40574ce9520987af24669_1749006573356100.png
joinx 对 orders 和 details 有序关联归并,结果游标包含两个字段。图中可以看到,每个字段值都是记录对象。

还要注意,两表是一对多关系,订单表数据会被复制。

例 4.2 客户号是 3 或 9 的订单,按照产品号分组统计订单金额。

select
d.product_id,sum(d.quantity * d.price)
from
orders o
join
details d on o.order_id = d.order_id
where o.customer_id =3
or o.customer_id=9
group by d.product_id;
执行时间 21 秒。

SPL 代码 20:

image.png
执行时间 0.6 秒。

例 4.3 求平均每个订单的金额。要求:找产品号不是 2、8 的订单明细,按照日期分组,求平均每个订单的金额。注意:订单数量要去重计数。

select
o.order_date,sum(d.quantity * d.price)/count(distinct o.order_id)
from
orders o
join
details d on o.order_id = d.order_id
where d.product_id !=2
and d.product_id !=8
group by o.order_date;
执行时间是 40 秒,在主子表关联后计算去重计数,这两种计算 SQL 的性能都不佳。

SPL 代码 21:
image.png
SPL 的有序去重计数性能要好的多,而且有序去重计数正好也需要数据对 order_id 有序,可以在有序归并后顺利实施。

执行时间:1.5 秒

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

1、找出产品号是 3 或者 6 的订单明细,按照客户分组,求平均每个订单的金额。

2、思考:在自己熟悉的数据库中有没有大主子表关联?是否可以用有序归并方法提速?

相关文章
|
5月前
|
SQL 存储 文件存储
第三篇 - 外键维表的关联:SPL轻量级文件存储提速查询实践
SPL 重构关联计算,区分外键与主键关联,通过序号化、预加载和预关联实现高效运算。相比 SQL 笛卡尔积式 JOIN,SPL 利用关联本质优化存储与计算,显著提升性能,如案例中查询提速数十倍。
SQL 存储 缓存
197 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如何满足大模型智算场景的存储需求
285 2
|
存储 弹性计算 监控