怎样用 esProc 为大主子表关联提速
类似订单和明细表这样的主子表关联比较常见,在 SQL 中,这种关联用 JOIN 实现,在两个表都很大的情况下,常常出现计算速度非常慢的现象。
如果预先将主子表都按照主键有序存储,就可以使用归并算法实现关联。这种算法只需要对两个表依次遍历,不必借助外存缓存,可以大幅降低计算量和 IO 量。
esProc 支持有序归并算法,可以大幅提升主子表关联计算性能。下面通过订单和订单明细的例子,比较一下 esProc SPL 和 MYSQL 数据库计算主子表关联的性能。
MYSQL 数据库中有订单表 orders,主键是订单号 oid,字段有客户号 cid,日期 odate,数据量一千万。订单明细表 details,主键是 oid 和明细号 did,字段有数量 quantity、单价 price,产品号 pid,数据量 3 千万。
测试环境:VMWARE 虚拟机,8 核 CPU,8G 内存,SSD 硬盘。操作系统是 Win11,MYSQL 版本是 8.0。
先下载 免费的esProc » esProc Download - esProc SPL Official Website,用标准版就可以了。
安装 esProc 后,试一下 IDE 是否可以正常访问数据库。先把 MYSQL 数据库的 JDBC 放到目录 "[安装目录]\common\jdbc",这是 esProc 的类路径之一:
在 esProc 中建立 MYSQL 数据源:
返回到数据源界面并连接刚才配置的数据源,如果数据源名变成粉色,说明配置成功。
在 IDE 中新建脚本,编写 SPL 语句,连接数据库,执行 SQL 读入 orders 表部分数据:
| A | B |
1 | =connect("mysql16") | |
2 | =A1.query("select * from orders limit 100") |
按 ctrl-F9 执行,可以在 IDE 右边看到 A2 的执行结果,很方便。
接下来完成数据准备,把历史数据从数据库导出到 esProc 的高性能文件:
| A |
1 | =connect("mysql16") |
2 | =A1.cursor("select oid,cid,eid from orders order by oid") |
3 | =file("orders.ctx").create(#oid,cid,eid) |
4 | =A3.append(A1) |
5 | =A1.query("select oid,did,quantity,price from details order by oid") |
6 | =file("details.ctx").create@p(#oid,did,quantity,price) |
7 | =A6.append(A5) |
8 | >A1.close(),A3.close(),A6.close() |
A2 生成 orders 表的数据库游标。
A3 建立组表对象,# 表示组表对 oid 有序。A4 将数据库游标数据追加到组表中。
A5 到 A7 照样生成明细表 details。注意 A6 中 create 函数增加了 @p 选项,这是因为子表 details 中的关联字段 oid 值并不是唯一的,@p 表示第一个字段 oid 是分段键,这样可以防止分段读取时,把一个 oid 的明细记录拆分开。
数据准备完成后,就可以利用 esProc 实现主子表计算提速了。
例一, 指定日期范围,按照客户分组统计订单金额:
select o.cid,sum(d.quantity * d.price)
from orders o
join
details d on o.oid = d.oid
where o.odate>='2025-01-15'and o.odate<='2025-03-15'
group by o.cid;
这两个大表关联,MYSQL 执行了 10 分钟没有出来结果。
esProc 采用有序归并:
| A |
1 | =file("orders.ctx").open().cursor@m(oid,cid;odate>=date(2025,1,15) && odate<=date(2025,3,15)) |
2 | =file("details.ctx").open().cursor(oid,quantity,price;;A1) |
3 | =joinx(A1:o,oid;A2:d,oid) |
4 | =A3.groups(o.cid;sum(d.quantity*d.price)) |
特别注意的是,A2 中游标的最后一个参数是 A1,表示多线程并行时,details 表会跟随 orders 表分段,保证后面两个表有序归并的正确性。
A3 中 orders 和 details 有序关联归并。A4 对归并的结果分组汇总。
执行时间:1.7 秒。
例题二,客户号是 3 或 9 的订单,按照产品号分组统计订单金额。
select d.pid,sum(d.quantity * d.price)
from orders o
join
details d on o.oid = d.oid
where o.cid =3or o.cid=9
group by d.pid;
MYSQL 也是执行了 10 分钟没有出来结果。
esProc 的写法:
| A |
1 | =file("orders.ctx").open().cursor@m(oid;cid==3 || cid==9) |
2 | =file("details.ctx").open().cursor(oid,quantity,price,pid;;A1) |
3 | =joinx(A1:o,oid;A2:d,oid) |
4 | =A3.groups(d.pid;sum(d.quantity*d.price)) |
执行时间:1.8 秒
例题三,产品号不是 2、8 的订单明细,按照日期分组,求平均每个订单的金额。
select o.odate,sum(d.quantity * d.price)/count(distinct o.oid)
from orders o
join details d on o.oid = d.oid
where d.pid !=2and d.pid !=8
group by o.odate;
MYSQL 仍然执行了 10 分钟没有出来结果。
这里是在主子表关联后计算去重计数,这两种计算 SQL 的性能都很差。esProc 的有序去重计数性能要好的多,而且有序去重计数正好也需要数据对 oid 有序,可以在有序归并后顺利实施。
SPL 的写法:
| A |
1 | =file("orders.ctx").open().cursor@m(oid,odate) |
2 | =file("details.ctx").open().cursor(oid,quantity,price;pid!=2 && pid!=8;A1) |
3 | =joinx(A1:o,oid;A2:d,oid) |
4 | =A3.groups(o.odate;sum(d.quantity*d.price)/icount@o(o.oid)) |
A4 中的 icount@o 就是有序去重计数。
执行时间:4 秒。
esProc 计算大主子表的性能,完胜 MYSQL。
esProc 提速方案的前提是主子表数据都按照主键 oid 有序存储。如果有新增数据的话,一般来说都是新的主键 oid,直接在已有的组表基础上追加就可以了。
如果历史数据需要变动,比如修改、插入或者删除,就要麻烦一些。变动的数据量不大时,可以写到一个单独的补区。在读取时补区与正常数据一起归并计算,这样访问时可以感觉不到补区的存在。
变动的数据量较大时,要重新生成全量有序数据,但是这个过程耗时较长,不能频繁进行。
实际上,针对固定不变的历史数据的计算场景就非常多了,也有不少大主子表关联计算亟需加速。这些场景采用 SPL 有序存储可以有效加速,而且实施起来非常方便。
相关文章:
怎样用 esProc 为大主子表关联提速
类似订单和明细表这样的主子表关联比较常见,在 SQL 中,这种关联用 JOIN 实现,在两个表都很大的情况下,常常出现计算速度非常慢的现象。 如果预先将主子表都按照主键有序存储,就可以使用归并算法实现关联。这种算法只需…...
打卡day31
文件的规范拆分和写法 知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业:尝试针对之前的心脏病项目,准备拆分的项目文件,思考下哪些部分可以未来复用。 导入依赖库 # 忽视警告 import warnings warn…...
编译原理的部分概念
解释程序:边解释边执行:不断读取源程序的语句,解释语句,读取此语句需要的数据,根据执行结果读取下一条语句,继续解释执行,直到返回结果。 编译程序:将源程序完整地转换成机器语言程…...
Java中字符串(String类)的常用方法
以下是Java中字符串(String类)的常用方法分类详解,包含核心方法说明和示例代码: 一、字符串基础信息 方法说明示例输出length()返回字符串长度"Hello".length()5isEmpty()判断字符串是否为空(长度是否为0&a…...
什么是 ERP,中国企业如何科学应用 ERP
中国企业在引入 ERP 系统过程中,常因盲目跟风大型企业选型、忽视自身业务适配性,导致系统功能过剩、实施成本高企、员工接受度低等问题,最终造成项目成功率不足 10%。因此,理性认知 ERP 的价值定位与本土化实施路径,成…...
使用SQLite Expert个人版VACUUM功能修复数据库
使用SQLite Expert个人版VACUUM功能修复数据库 一、SQLite Expert工具简介 SQLite Expert 是一款功能强大的SQLite数据库管理工具,分为免费的个人版(Personal Edition)和收费的专业版(Professional Edition)。其核心功…...
同源策略深度防御指南:CSP 高级应用与企业微信全场景适配(含 report-uri 实战)
一、CSP 核心指令权威解析与企业微信适配 内容安全策略(CSP)通过Content-Security-Policy响应头实现资源加载的细粒度控制,其核心指令与企业微信场景强相关: 1.1 frame-ancestors:iframe 嵌入源控制 权威规范&#…...
【AGI】大模型微调技术-四大微调框架
【AGI】大模型微调技术-四大微调框架 (1)微调基础概念介绍1.1 微调基本概念1.2 全量微调与高效微调1.3 模型微调的优劣势分析1.4 高效微调与LoRA、QLoRA (2)高效微调的应用场景(3)流微调工具介绍3.1 unslot…...
小白编程学习之巧解「消失的数字」
一、引言:一个看似简单的「找不同」问题 今天遇到一道有趣的算法题:给定一个含 n 个整数的数组 nums,其中每个元素都在 [1, n] 范围内,要求找出所有在 [1, n] 中但未出现在数组中的数字。 这让我想起小时候玩的「找错题」游戏 —…...
在 Git 中添加子模块(submodule)的详细步骤
在 Git 中添加子模块(submodule)的详细步骤如下: 1. 添加子模块 命令格式: git submodule add <仓库URL> [目标路径]仓库URL:子模块的 Git 仓库地址(HTTP/SSH 均可)。目标路径ÿ…...
瑞萨单片机笔记
1.CS for CC map文件中显示变量地址 Link Option->List->Output Symbol information 2.FDL库函数 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…...
单片机复用功能重映射Remap功能
目录 一、查看“DS5319 stm32f10x中等密度mcu数据手册(英文)”手册 二、查看“RM0008 STM32F10xxx参考手册(中文)”手册 三、重映射(Remap)功能程序编写 自己学习过程中容易遗忘的知识点,记录…...
小白入门FPGA设计,如何快速学习?
很多刚入门的小伙伴,初次听说FPGA(现场可编程门阵列),脑子里只有一个字:玄! 什么“时序逻辑”“Verilog”“Vivado”,仿佛一夜之间掉进了电子黑魔法的深坑。 但真相是—— FPGA,其实…...
友思特应用 | LCD显示屏等玻璃行业的OCT检测应用
导读 光学相干层析成像(OCT)是一种非侵入式光学成像方法,提供微米尺度的空间分辨率,能够生成内部结构截面图像。自20世纪90年代初发明第一台OCT以来,它在眼科领域得到了广泛应用,并成为临床诊断的黄金标准之一。除了在生物医学领…...
Python的sys模块:系统交互的关键纽带
Python的sys模块:系统交互的关键纽带 对话实录 小白:(挠头)我知道 Python 能做很多事,可怎么让它和计算机系统‘交流’呢,比如获取系统信息、处理命令行参数? 专家:(微…...
若依项目集成sentinel、seata和shardingSphere
集成组件包括MySQL分库分表及读写分离、seata以及Sentinel 若依项目文档连接 代码下载地址 需要结合ruoyi代码配合看,前提是熟悉基本代码结构,熟悉feign调用和基础网关配置等。 采用的版本信息 <java.version>1.8</java.version> <spr…...
张 推进对话式心理治疗:SOULSPEAK的聊天机器人
SOULSPEAK的聊天机器人 利用大语言模型(LLM)来提供低成本的心理治疗服务,旨在解决传统心理咨询在隐私、成本和可及性方面的不足。以下是核心内容的通俗解读: 1. 研究背景:传统心理治疗的困境 问题:全球心理健康问题日益严重(如焦虑、抑郁人数激增),但传统心理咨询受…...
java中的Filter使用详解
Filter(过滤器)是 Java Web 开发的核心组件之一,用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析: 一、Filter 的作用与原理 核心作用 Filter 充当请求与响应之间的…...
BERT 作为Transformer的Encoder 为什么采用可学习的位置编码
摘要 BERT 在位置编码上与原始 Transformer 论文中的 sin/cos 公式不同,选择了可学习(learned)的位置嵌入方案。本文将从 Transformer 原始位置编码选项入手,分析 BERT 选择 learned positional embeddings 的四大核心原因&#x…...
Vue百日学习计划Day43-45天详细计划-Gemini版
Day 43: Composable 函数基础与抽取简单逻辑 (~3 小时) 本日目标: 理解 Composable 函数的概念、优势,并学会如何将简单的、无状态的逻辑抽取为 Composable。所需资源: Vue 3 官方文档 (组合式函数): https://cn.vuejs.org/guide/reusability/composables.html 学…...
Kotlin 协程 (二)
Kotlin 协程提供了丰富的功能,能够高效地处理并发和异步任务。以下是对 Kotlin 协程中常见概念和功能的详细讲解,包括它们的定义、作用、使用场景以及最佳实践。 1. 协程核心概念 1.1 CoroutineScope 定义:CoroutineScope 是协程作用域的抽…...
Linux 下 rsync 工具详解与实用指南
Linux 下 rsync 工具详解与实用指南 一、什么是 rsync? rsync(remote sync)是 Linux/Unix 系统下常用的数据同步和备份工具。它可以高效地在本地与远程主机之间同步文件和目录,支持增量同步、断点续传、权限保留等功能ÿ…...
2025年医美行业报告60+份汇总解读 | 附 PDF 下载
原文链接:https://tecdat.cn/?p42122 医美行业在消费升级与技术迭代的双重驱动下,已从边缘市场逐步走向主流。数据显示,2024 年中国医美市场规模突破 3000 亿元,年复合增长率达 15%,但行业仍面临正品率不足、区域发展…...
汉得集星獭1.8.0正式发布,高效集成再赋能!
汉得企业级系统集成平台 (中文名集星獭,英文名JeeStar)1.8.0版本于2025年4月正式发布 。 集星獭是一款一站式多系统集成、多云集成、多端集成、多协议集成、多设备集成、数据集成、页面集成的全域集成解决方案产品。 此次发布主要聚焦于以下…...
一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异
在 Solana 链上,Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型,到后续的自动迁移与交易市场,Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…...
数据库实验——备份与恢复
一、目的(本次实验所涉及并要求掌握的知识点) 1.掌握SQL server的备份与恢复 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析) 验证性实验 实验1:在资源管理器中建立备份设备实验 …...
抓包分析工具与流量监控软件
目录 一、抓包分析工具:定位问题的“放大镜” 1.1 工作原理简述 1.2 主流工具盘点 1.3 抓包的实战应用 二、流量监控软件:网络全景的“雷达系统” 2.1 功能特征 2.2 常用工具概览 2.3 实战应用场景 五、结语:深入可见,安…...
Go语言实战:使用 excelize 实现多层复杂Excel表头导出教程
Go 实现支持多层复杂表头的 Excel 导出工具 目录 项目介绍依赖说明核心结构设计如何支持多层表头完整使用示例总结与扩展 项目介绍 在实际业务系统中,Excel 文件导出是一项常见功能,尤其是报表类需求中常见的复杂多级表头,常规表格组件往…...
【算法】定长滑动窗口5.20
定长滑动窗口算法: 算法思路 滑动窗口遍历字符串:窗口大小为 k ,遍历字符串每个字符,维护窗口内元音字母数量。 统计窗口内元音:当字符是元音(a/e/i/o/u)时,计数器 vowel 加 1。…...
Java操作Elasticsearch 之 [Java High Level REST Clientedit]
<a name"VbjtD"></a> 1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json。向 Elasticsearch 中存储数据,其实就是向 es 中的 index 下…...
数据集划分与格式转换:从原始数据到模型训练的关键步骤
在计算机视觉项目中,数据集的合理划分和格式转换是实现高效模型训练的基础。本文将详细介绍如何将图片和标注数据按比例切分为训练集和测试集,以及常见的数据格式转换方法,包括 JSON 转 YOLO 格式和 XML 转 TXT 格式。 一、将图片和标注数据…...
MinerU
简介 MinerU 是一款功能全面的文档处理系统,旨在将 PDF 和其他文档格式转换为机器可读的格式,例如 Markdown 和 JSON。该系统专注于在保留文档结构的同时,准确提取文档内容,处理复杂的布局,并转换公式和表格等特殊元素…...
Vue百日学习计划Day46-48天详细计划-Gemini版
Day 46: <KeepAlive> - 组件缓存与优化 (~3 小时) 本日目标: 理解 <KeepAlive> 的作用,学会如何使用它来缓存组件实例,从而优化应用性能和用户体验。所需资源: Vue 3 官方文档 (<KeepAlive>): https://cn.vuejs.org/guide/built-ins/…...
微软的 Windows Linux 子系统现已开源
微软宣布其 Windows Linux 子系统 (WSL) 开源,开放代码供社区成员贡献。自近九年前推出适用于 Windows 10 的 WSL 以来,微软多年来一直致力于开源这项在 Windows 中启用 Linux 环境的功能。 Windows 首席执行官 Pavan Davuluri 表示:“这是开…...
Axure中使用动态面板实现图标拖动交换位置
要在Axure中实现图标拖动交换位置的功能,可以通过动态面板结合交互事件来实现。 实现步骤 准备图标元素 将每个图标转换为动态面板(方便拖动和交互)。 设置拖动交互 选中图标动态面板 → 添加“拖动时”交互 → 选择“移动”当前动态面板&am…...
深入浅出:Spring Cloud Gateway 扩展点实践指南
文章目录 前言一、为什么需要扩展 Spring Cloud Gateway?二、Spring Cloud Gateway 核心扩展点三、扩展点实战:代码与配置详解3.1 全局过滤器(GlobalFilter)3.2 路由过滤器(GatewayFilter)2.3 自定义路由断…...
SCAU18923--二叉树的直径
18923 二叉树的直径 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点…...
理解 RESTful 风格:现代 Web 服务的基石
在当今的互联网时代,Web 服务成为了连接各种应用和系统的关键。而 RESTful 风格,作为一种广泛采用的架构风格,为设计和实现 Web 服务提供了一套简洁而强大的指导原则。本文将深入探讨 RESTful 风格的核心概念、优势以及如何在实际项目中应用它…...
大模型(3)——RAG(Retrieval-Augmented Generation,检索增强生成)
文章目录 1. 核心组成2. 工作流程3. 训练方式4. 优势与局限5. 应用场景6. 典型模型变体总结 RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索与文本生成的技术,旨在通过引入外部知识库提升生成内容的准确性…...
电子科技大学软件工程实践期末
Java基础 面向对象 Java高级编程 2023: 软件工程基础 ch1软件工程概述 软件的概念和特点 软件危机的概念以及产生的原因 软件工程的定义 三要素 应用软件工程的原因 三要素:工具,方法,过程 ch2 软件过程 软件生命周期 软件过程…...
线上jvm假死问题排查
1.线上告警接口超时 看接口是用户服务,查看nacos服务实例,发现有一个节点已经下线了 3.找到对应节点所在服务器,jps -l 命令发现用户服务还在,初步判断是假死 4.使用 jstat -gc 进程id 1000 每秒打印gc情况,发现频繁…...
Redis中SETNX、Lua 脚本和 Redis事务的对比
在 Redis 中,SETNX、Lua 脚本 和 Redis 事务 都可以用于实现原子性操作,但它们的适用场景和能力范围不同。以下是详细对比和原因分析: 1. SETNX 的原子性与局限性 (1) 原子性保证 SETNX(SET if Not eXists) 是 Redis…...
Nginx配置记录访问信息
文章目录 方法一:使用Nginx原生配置记录访问信息方法二:使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如:Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中,无论是功…...
基于机载激光雷达数据的森林生物量估测:AI驱动的遥感革新
一、技术背景与意义 森林生物量是生态系统碳循环和碳汇估算的核心参数。传统遥感方法(如光学影像)在三维结构解析上存在局限,而机载激光雷达(LiDAR)凭借高精度点云数据,能够捕捉森林的垂直结构信息。结合人…...
Redis中的事务和原子性
在 Redis 中,事务 和 原子性 是两个关键概念,用于保证多个操作的一致性和可靠性。以下是 Redisson 和 Spring Data Redis 在处理原子性操作时的区别与对比: 1. Redis 的原子性机制 Redis 本身通过以下方式保证原子性: 单线程模型…...
SSL证书:谷歌算法排名的安全基石与信任杠杆
一、技术演进:从安全信号到算法基石 谷歌对SSL证书的重视始于2014年,当时HTTPS首次被纳入排名算法信号。经过十年迭代,SSL证书已从“加分项”升级为“基础门槛”。2025年算法更新中,其权重占比达2%,与页面加载速度、移…...
XXX企业云桌面系统建设技术方案书——基于超融合架构的安全高效云办公平台设计与实施
目录 1. 项目背景与目标1.1 背景分析1.2 建设目标2. 需求分析2.1 功能需求用户规模与场景终端兼容性2.2 非功能需求3. 系统架构设计3.1 总体架构图流程图说明3.2 技术选型对比3.3 网络设计带宽规划公式4. 详细实施方案4.1 分阶段部署计划4.2 桌面模板配置4.3 测试方案性能测试工…...
【GESP真题解析】第 18 集 GESP 一级 2024 年 12 月编程题 1:温度转换
大家好,我是莫小特。 这篇文章给大家分享 GESP 一级 2024 年 12 月编程题第 1 题:温度转换。 题目链接 洛谷链接:B4062 温度转换 一、完成输入 根据题意,输入只有一行,为实数,数据范围: 0 &l…...
鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
一、前言 在鸿蒙生态蓬勃发展的当下,开发者对于高效、优质的应用开发语言需求愈发迫切。ArkTS 作为鸿蒙应用开发的核心语言,在继承 TypeScript 优势的基础上,进行了诸多优化与扩展,为开发者带来了全新的编程体验。本文将深入剖析…...
现代计算机图形学Games101入门笔记(十七)
双向路径追踪 外观建模 散射介质 人的头发不能用在动画的毛发上。 动物的髓质Medulla特别大 双层圆柱模型应用 BSSRDF是BRDF的延伸。 天鹅绒用BRDF不合理,转成散射介质。 法线分布 光追很难处理微表面模型 光在微型细节上,光是一个波,会发生衍…...