轻量级数据外置提速查询实践

传统交易(TP)数据库不擅长分析计算,而专业 OLAP 数据库又过于沉重,经常需要集群,不仅成本高昂,也会使系统架构变得更复杂。

把不再变化的历史数据存储成轻量级的 esProc SPL 列存文件,可以利用 SPL 语言的强大计算能力,跑出远超传统数据库的查询性能。esProc SPL 很轻,直接嵌入应用就可以运行,在实现数据外置提速的同时,也不会让整个系统架构变得很复杂:

..

这里准备了一套使用 SPL 外置数据提速查询的实践方法:

第一篇 - 常规过滤及分组汇总

第二篇 - COUNT DISTINCT

第三篇 - 外键维表的关联

第四篇 - 大主子表关联

第五篇 - 大主子表关联时的 EXISTS

第六篇 - 枚举字段条件过滤

其中涉及的实例都是传统数据库很头疼的性能问题,比如 COUNT DISTINCT,外键 JOIN,大主子表关联(包括 EXISTS),枚举字段条件过滤(包括 IN)等,助您突破数据库查询性能瓶颈!

开始之前,需要做些准备工作。

【这里】有例子数据 csv 文件和建表 SQL,模拟某公司线下订单和电子商务的部分数据。需要在 MYSQL 数据库中建表,并导入 csv 数据。

..

例子表结构是这样的:

..

事件表 events,电商网站用户的操作事件,一千万行,包括字段:

字段名称

说明

类型

备注

event_id

事件号

整数

主键

user_id

用户号

整数

大约 100 万个

event_time

时间

日期时间

2025 年内

event_type

事件类型

整数

1 表示 login,2 表示 view,…,7 表示 confirm

订单表 orders,存储线下订单数据,一千万行:

字段名称

说明

类型

备注

order_id

订单号

整数

主键

customer_id

客户号

整数


employee_id

雇员号

整数


employee_name

雇员名

字符串


order_date

日期

日期

2024 年内

shipper_id

运货商号

整数


shipping_fee

运货费

数值


shipping_address

运货地址

字符串


订单名细表 details,存储线下订单明细数据,三千万行:

字段名称

说明

类型

备注

order_id

订单号

整数

主键

product_id

产品号

整数

主键

quantity

数量

整数


price

单价

数值


客户表 customer,存储线下客户数据,数据量较小:

字段名称

说明

类型

备注

customer_id

客户号

整数

主键

customer_name

客户名

字符串


city_id

城市号

整数


城市表 city,存储线下客户所在城市数据,数据量较小:

字段名称

说明

类型

备注

city_id

城市号

整数

主键

city_name

城市名

字符串


state_id

州号

整数


州表 state,存储线下客户所在州数据,数据量较小:

字段名称

说明

类型

备注

state_id

州号

整数

主键

state_name

州名

字符串


运货商表 shipper,存储线下运货商数据,数据量较小:

字段名称

说明

类型

备注

shipper_id

运货商号

整数

主键

shipper_name

运货商名

字符串


下载 esProc https://www.esproc.com/download-esproc/,用标准版就可以了。

安装 esProc 后,试一下 IDE 是否可以正常访问数据库。我们以 MYSQL 数据库为例,先把 MYSQL 的 JDBC 放到目录 "[安装目录]\common\jdbc",这是 esProc 的类路径之一:

..

在 esProc 中建立 MYSQL 数据源,菜单栏选择 Tool-Connect to Data Source,配置 MySQL 标准 JDBC 连接,名字是 speed:

..

返回到数据源界面并连接刚才配置的数据源,如果数据源名变成粉色,说明配置成功。

..

在 IDE 中新建脚本,编写 SPL 语句,连接数据库,通过 SQL 加载 orders 表的数据。

SPL 代码 1:


A

1

=connect("speed")

2

=A1.query@x("select * from orders limit 100")

按 ctrl-F9 或单击执行按钮后,点击 A2 格,在右边可以看到 100 条数据。

SPL 代码写在单元格中,可以直接用格名作为临时变量。

如果遇到问题可以查阅教程和函数参考:

教程地址:https://d.raqsoft.com.cn:6443/esproc/tutorial/

函数参考:https://d.raqsoft.com.cn:6443/esproc/func/

实践使用的测试环境是 VMWARE 虚拟机,8 核 CPU,8G 内存,SSD 硬盘,操作系统是 Win11,MYSQL 版本是 8.0,esProc SPL 是标准版。