第一篇 - 常规过滤及分组汇总:SPL轻量级文件存储提速查询实践

简介: 本文以订单表为例,介绍如何使用 esProc SPL 实现数据外置,提升过滤与分组汇总计算效率。通过 SPL 的 ETL 工具导出数据为 BTX 与 CTX 格式,并利用游标、列存、并行计算等技术逐步优化性能,最终执行时间从 MySQL 的 11 秒降至 0.5 秒。适用于处理大数据量、历史数据的高性能分析场景。

我们以订单表为例实现 esProc SPL 数据外置,提速常规过滤及分组汇总计算。
e70e6a1958743390800d50ad22161aaa_1749006570964100.png
我们使用 SPL 的 ETL 工具来生成脚本,实现数据的转储。在 [SPL 安装目录]\esProc\bin 找到 dft.exe,运行后选择文件 - 新建 ETL。打开工具 - 数据连接:
2fbc5145433229b8db03d66a316884c0_1749006571088100.png
点击连接后,数据库的表可以拖拽到工作区:
3175134e01b39294e051cd7e247a325f_1749006571231100.png
双击数据表或点击编辑按钮,设置导出选项:
3d6b68b5fc042500c17ed7b37a0b7c3e_1749006571307100.png
工具 - 数据目录,设置数据文件存储的目录。
61e1a29b88a5cf1a8389dea7e68ae918_1749006571373100.png
工具 - 生成 SPLX 代码:
401b78e103e8dc482b38ea4d475e63bf_1749006571438100.png
导出后,记得这次新建的 etl 保存成 Q1.etl 文件。

SPL 代码 2:导出的 SPL 代码,是从 MYSQL 数据库中导出数据,转储成集文件 BTX。
image.png
例 1.1,按雇员分组统计运货费的 SQL 是这样:

select 
    employee_id,
    count(*) as order_count,
    sum(shipping_fee) as total,
    avg(shipping_fee) as average,
    max(order_date) as latest_order_date
from 
    orders
where 
    order_date between '2024-01-01' and '2024-10-31'
    and shipper_id<>1  
    and shipping_fee > 10
group by 
employee_id;

执行这个 SQL 需要 11 秒

SPL 代码 3:

image.png

订单表比较大不能全部读入内存,这里 A3 使用的是游标,是分批读入数据,边读边算的。 注意,游标只取出需要的字段,可以减少生成的对象,并减少内存占用,提高性能。

A4 中的 select 函数相当于 SQL 中的 WHERE 子句,用于过滤。

A5 则对过滤后的结果做分组,语法形式和 SQL 不同,但仔细看会发现涉及的要素都是一样的:分号前的部分是分组键,相当于 SQL 的 GROUP BY 部分,分号后是聚合值,相当于 SQL 中 SELECT 中的聚合运算。SPL 的分组会缺省将分组键和聚合值拼成结果集,不像 SQL 那样要在 SELECT 中把分组键再写一遍。

SPL 的执行时间是 2.2 秒。BTX 是行式存储,还不能最大程度发挥 SPL 的性能。

用 ETL 工具编辑 orders 表:

856f50155b44695dc3bc0748e86a0c14_1749006571611100.png
导出 SPL 代码 4:把数据转储成列存组表 CTX。
image.png
CTX 默认是列存,适合字段总数较多,而计算的时候用到字段比较少的情况。

CTX 创建时要指明数据结构,会比 BTX 略复杂些。

SPL 代码 5:用 CTX 计算例 1.1 的代码。

image.png
代码和 BTX 基本一样,只是 A3 产生游标的代码不同。CTX 需要先打开组表对象,然后建立游标。

执行时间是 1.9 秒,比 BTX 快。

接下来使用 CTX 游标过滤技术进一步提速:把过滤条件附加到游标上,SPL 先读出用于计算条件的字段值,如果条件不成立就放弃读取其他字段,条件成立才继续读出其它字段并创建这条记录。

这样可以减少硬盘读取,避免产生不必要的对象,提高性能。

SPL 代码 6:
image.png
A3 中的游标取数时,先读出 orders.ctx 的 order_date,shipper_id,shipper_fee 字段用于计算条件,如果条件不成立就放弃读取其他字段,如 employee_id。条件成立才继续读出其它需要的字段并创建这条记录。

游标过滤算法的执行时间是 1.8 秒。

继续用并行技术提高性能,SPL 能方便地写并行代码,只要配置一下并行数,和 CPU 核数一致即可,这里配置了 8 并行。
e019600d1a07e8c3e19d3067df022dda_1749006571701100.png
SPL 代码 7:BTX 上并行计算。
image.png
cursor 函数增加 m 选项就可以了,执行时间是 0.6 秒

SPL 代码 8:基于 CTX 并行计算。
image.png
也是给 cursor 函数增加 m 选项,执行时间是 0.5 秒

小结一下性能(单位 - 秒):
image.png
MySQL 在并行方面似乎不够好,设置了并行参数后,性能也没显著提升。这不是本文的关注重点,也就不深究了。

后续的测试未加说明都是指 8 线程并行。

需要注意的是,SPL 文件存储有其特定的适用场景。因为要导出数据,所以更适合计算不变的历史数据,其实这种场景就很多了。

请动手练习一下:

1、按客户分组统计运货费,过滤条件要有 order_date 和 employee_id。

2、从自己熟悉的测试数据库中导出较大的表,生成 BTX、CTX,尝试前面讲到的计算。

相关文章
|
2天前
|
SQL 存储 文件存储
第三篇 - 外键维表的关联:SPL轻量级文件存储提速查询实践
SPL 重构关联计算,区分外键与主键关联,通过序号化、预加载和预关联实现高效运算。相比 SQL 笛卡尔积式 JOIN,SPL 利用关联本质优化存储与计算,显著提升性能,如案例中查询提速数十倍。
SQL 存储 缓存
54 1
|
4月前
|
SQL 存储 OLAP
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
传统交易型数据库在分析计算中常遇性能瓶颈,将数据迁至OLAP数据仓库虽可缓解,但成本高、架构复杂。SPL通过轻量级列存文件存储历史数据,提供强大计算能力,大幅简化架构并提升性能。它优化了列式存储、数据压缩与多线程并行处理,在常规及复杂计算场景中均表现优异,甚至单机性能超越集群。实际案例中,SPL在250亿行数据的时空碰撞问题上,仅用6分钟完成ClickHouse集群30分钟的任务。
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
|
9月前
|
存储 固态存储 文件存储
并行文件存储在大模型训练中的探索与实践
阿里云智能集团存储产品专家何邦剑分享了并行文件存储CPFS在大模型训练中的应用。CPFS针对大模型训练的IO特点,优化性能、降低成本、提升用户体验。它支持多计算平台共享访问,具备数据分层存储、生命周期管理、缓存加速等特性,实现高效的数据处理与管理,显著提升训练效率和资源利用率。尤其在大规模集群中,CPFS提供了高吞吐、低延迟及灵活扩展的能力,助力客户如零一万物实现高性能训练。
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
|
缓存 监控 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(二)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(二)
|
缓存 NoSQL 算法
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(一)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(一)
|
缓存 NoSQL Java
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(三)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(三)