第六篇 - 枚举字段条件过滤--SPL轻量级文件存储提速查询实践

简介: 针对枚举字段过滤时,传统方法需多次比较,性能随取值数量增加而下降。esProc SPL 引入对位序列机制,将条件判断转化为布尔序列的位置取值,避免逐条比较,大幅提升查询效率。通过预生成与维表等长的对位序列,实现常数时间过滤,尤其适用于大表多值筛选场景,性能提升显著。

枚举字段的取值是有限几种值,针对枚举字段 f 的过滤条件写成 f =v1 or f=v2 or…或者 f !=v1 and f !=v2 and…,也可能写成 in 或者 not in。数据库要用 f 与 n 个值比较计算,数据表较大的时候比较次数会很多,性能就会比较差,而且 n 越大性能越差。

如果在过滤的时候,能不再做比较,性能自然大幅提高。esProc SPL 提供的对位序列机制可以起到这样的作用。

下面通过订单表的例子来看怎样使用对位序列。先确定枚举字段的取值范围,字段 customer_id 有对应维表,取值范围已经确定了。字段 employee_id,employee_name 没有对应维表,需要预先遍历事实表 orders 确定取值范围,生成维表。这里假设没有 employee_id 这个字段,且雇员没有同名的。

前面第三篇已经生成了维表 employee.btx,orders 使用前面的 ordersQ3.ctx,employee 已序号化。

例 6.1 找出雇员是 name10 或 name101 的订单,按日期统计订单数。

select order_date,count(1)
from orders
where 
    employee_name='name10' or employee_name='name101'
group by order_date;

执行时间 20 秒。

SPL 代码 27:
image.png
执行时间 0.1 秒。

重点看 A3 利用过滤条件生成对位序列:

6b842476cd90759b3028098b8b4f1dee_1749006573437100.png
图中左边是 employee 表,右边是对位序列。

对位序列是和维表 employee 等长的布尔值序列。函数 contain 判断 [“name10”,“name101”] 是否包含当前位置 name 值,包含则对位序列同样位置的成员被赋值成 true,否则就是 false。

有了对位序列,A4 就可以用来过滤了:
8388e1fd7474a08f3c61fe50e94b4ad1_1749006573507100.png
对订单表(图中间)过滤,常规计算是用 employee_num 去 employee 表(图左边)对应位置取 name,然后和 [“name10”,“name101”] 比较。

SPL 则用序号去对位序列(图右边)中取对应位置的布尔值,是 true 表示满足条件,否则就是不满足。这就不需要比较 name 了,把比较运算转化成了按位置取序列成员。

我们看不用对位序列的写法。

SPL 代码 28:
image.png
A2 条件过滤需要比较字符串是否相同。

执行时间:0.1 秒

例 6.2 找出雇员是 name10 等 10 人的订单,按日期统计订单数。

这个例子要写 or 就有点多了,SQL 用 in 写:

select order_date,count(1)
from orders
where 
    employee_name in ('name10' , 'name101',) 
group by order_date;

执行时间 16 秒。

SPL 代码 29:采用对位序列的写法。
image.png
执行时间 0.15 秒

代码在上面基础上增加待比较的雇员名即可。

SPL 代码 30:不使用对位序列。
image.png
执行时间:0.18 秒。

例 6.3 找出客户城市编号是 35 的订单,统计总运费。

SQL 要使用子查询:

select sum(shipping_fee)
from orders
where 
    customer_id in (
        select customer_id
        from customer
        where city_id=35);

执行时间:13 秒。

SPL 代码 31:使用对位序列。
image.png
执行时间 0.1 秒

SPL 代码 32:不使用对位序列。
image.png
执行时间:0.1 秒。

用 cutomer_id 主键查找计算和按位置取成员的差别不明显。

性能小结:
image.png
请动手练习:

1、找出客户城市编号是 3 的订单,统计总订单数。

2、思考:在自己熟悉的数据库中有没有大表枚举字段过滤计算?是否可以用对位序列提速?

相关文章
|
2月前
|
人工智能 运维 算法
机器视觉公司有哪些:德创测控引领,产教融合优选指南​
本文依据权威报告,结合产教适配度、技术成熟度与服务保障力,推荐苏州德创、海康机器人、凌云光、大恒图像、华数机器人五家机器视觉公司,助力用户科学决策。
|
2月前
|
人工智能 运维 安全
云栖专刊 | 深度解读阿里云网络全新能力升级,助力企业出海和AI创新
阿里云飞天洛神云网络在2025云栖大会发布全新升级,聚焦企业出海与AI创新,推出确定性网络、智能云网络及AI for Network三大能力,提升全球连接质量,构建高效、安全、智能的云网络底座。
410 8
云栖专刊 | 深度解读阿里云网络全新能力升级,助力企业出海和AI创新
|
3月前
|
人工智能 监控 安全
提效40%?揭秘AI驱动的支付方式“一键接入”系统
本项目构建AI驱动的研发提效系统,通过Qwen Coder与MCP工具链协同,实现跨境支付渠道接入的自动化闭环。采用多智能体协作模式,结合结构化Prompt、任务拆解、流程管控与安全约束,显著提升研发效率与交付质量,探索大模型在复杂业务场景下的高采纳率编码实践。
507 26
提效40%?揭秘AI驱动的支付方式“一键接入”系统
|
缓存 运维 NoSQL
Redis 集群化部署实战:打造高可用、可扩展的缓存系统
本文详细介绍Redis集群化部署方案,涵盖架构设计、环境准备、配置优化、Docker部署、集群管理、监控运维及故障处理,助你构建高可用、可扩展的分布式缓存系统。
341 2
|
2月前
|
消息中间件 人工智能 Apache
Apache RocketMQ × AI:面向 Multi-Agent 的事件驱动架构
本文介绍基于Apache RocketMQ构建异步化Multi-Agent系统的新架构,通过语义化Topic实现Agent能力发现,利用Lite-Topic支持轻量级异步通信与结果反馈,结合InterestSet+ReadySet事件驱动模型,高效支撑任务闭环、状态恢复与动态编排,为Agentic AI提供高扩展、低延迟的协同机制。
|
2月前
|
数据采集 存储 安全
一文讲清数据要素,数据资产,数据治理和数字资产
本文系统梳理了数据要素、数据资产、数据治理与数字资产四大核心概念。数据要素确立数据作为基础生产要素的战略地位;数据资产是企业可控制并带来经济利益的数据资源;数据治理是保障数据质量与安全的管理框架;数字资产则是涵盖数据资产在内的所有数字化有价值资产的统称。厘清四者关系,构建清晰数据认知体系,助力企业高效决策与价值实现。
|
2月前
|
消息中间件 人工智能 Apache
Apache RocketMQ × AI:面向 Multi-Agent 的事件驱动架构
本文介绍基于Apache RocketMQ构建异步化Multi-Agent系统的新架构,通过语义化Topic实现Agent能力发现,利用Lite-Topic支持轻量级异步通信与结果反馈,结合InterestSet+ReadySet事件驱动模型,高效支撑任务闭环、状态恢复与动态编排,为Agentic AI提供高扩展、低延迟的协同机制。
|
2月前
|
存储 Java Go
Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?
Channel是Go实现CSP并发模型的核心,通过goroutine间安全的数据传递与同步,避免锁和条件变量的复杂性。其底层基于循环队列与等待队列,支持发送接收、阻塞唤醒等机制,并建立happens-before因果关系,确保并发确定性。
1255 0
|
2月前
|
存储 算法 Java
深入理解JVM:内存管理与垃圾回收机制探索
JVM是Java程序的运行核心,实现跨平台、自动内存管理与高效执行。其架构包括类加载、运行时数据区、执行引擎等模块。内存模型历经演变,JDK 8起以元空间替代永久代,优化GC性能。JVM通过分代回收机制,结合标记清除、复制、整理等算法,管理对象生命周期,提升系统稳定性与性能。
|
2月前
|
并行计算 数据挖掘 5G
MATLAB R2024b 数据分析软件,安装详细步骤,附安装包
MATLAB R2024b 发布,聚焦性能提升与稳定性优化,支持GPU加速、5G/6G工具链及HDL代码生成,新增NPU硬件支持,配合深色界面与调试增强,助力高效科学计算与工程设计。
1333 3