千家信息网

性能优化技巧 - 内存关联计算

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,关联动作会严重影响性能,SPL支持内存预关联,可以加快关联动作,从而提升性能。为了理解关联动作对性能的影响,下面设计一套Oracle关联表,以及无关联的宽表,并执行同样的计算。关联表的结构和关系如下:
千家信息网最后更新 2026年11月01日性能优化技巧 - 内存关联计算

关联动作会严重影响性能,SPL支持内存预关联,可以加快关联动作,从而提升性能。

为了理解关联动作对性能的影响,下面设计一套Oracle关联表,以及无关联的宽表,并执行同样的计算。

关联表的结构和关系如下:

数据量:通话记录表(百万条)、用户表(十万条)、开户网点(一万条),代理商表(一万条)。

计算目标:求通讯总成本,即所有呼出用户和呼入用户分别对应的网点均摊成本、代理商均摊成本之和。

将关联结果写入另一张表,形成无关联的宽表:

callRecordWide
SERIALNUMBER
CHARGE
OUTBRANCHOUTCOST
INBRANCHINCOST
OUTAGENTOUTCOST
INAGENTINCOST

下面的SPL脚本,用来说明关联动作对性能的影响:


AB
1=connect("orcl")
2=now()
3for 10=A1.query("select sum(outBranch.outCost+inBranch.inCost+outAgent.outCost+inAgent.inCost) from callRecord,callUser outUser,callUser inUser,telecomBranch outBranch,telecomBranch inBranch,telecomAgent outAgent,telecomAgent inAgent where callRecord.outID=outUser.userID and callRecord.inID=inUser.userID and outUser.branchID=outBranch.branchID and outUser.agentID=outAgent.agentID and inUser.branchID=inBranch.branchID and inUser.agentID=inAgent.agentID")
4=interval@ms(A2,now())/Oracle关联表25802ms
5

6=now()
7for 10=A1.query("select sum(outBranchOutCost+inBranchInCost+outAgentOutCost+inAgentInCost) from callRecordWide")
8=interval@ms(A6,now())/oracle宽表2055ms
9=A1.close()

可以看到,关联比无关联慢12.6倍(25802/2055),会严重影响计算性能。

SPL可以通过预关联来提升关联动作的性能。首先加载数据到内存,代码如下:


AB
1=connect("orcl")
2=A1.query("select * from telecomAgent").keys(AGENTID)
3=A1.query("select * from telecomBranch").keys(BRANCHID)
4=A1.query("select * from callUser").keys(USERID)
5=A1.query("select * from callRecord").keys(SERIALNUMBER)
6=A1.switch(AGENTID,A2:AGENTID; BRANCHID,A3:BRANCHID)
7=A5.switch(OUTID,A14:USERID; INID,A4:USERID)
8=env(callRecord,A7)/全局变量:预关联

函数switch可将字段值替换为记录引用,从而实现预关联。

后续业务算法中,可以直接引用其他表的字段,从而提升关联计算的性能,如下:

=callRecord.sum(OUTID.BRANCHID.OUTCOST+INID.BRANCHID.INCOST

+OUTID.AGENTID.OUTCOST+INID.AGENTID.INCOST)

为了直观理解预关联对计算性能的提升,下面同样用SPL预关联和宽表做比较。


AB
11=connect("orcl")
12=A11.query("select * from telecomAgent").keys(AGENTID)
13=A11.query("select * from telecomBranch").keys(BRANCHID)
14=A11.query("select * from callUser").keys(USERID)
15=A11.query("select * from callRecord").keys(SERIALNUMBER)
16=A14.switch(AGENTID,A12:AGENTID; BRANCHID,A13:BRANCHID)
17=A15.switch(OUTID,A14:USERID; INID,A14:USERID)
18=env(callRecord,A17)/全局变量:预关联
19=A11.query@s("select * from callRecordWide").keys(SERIALNUMBER)
20=env(callRecordWide,A19)/全局变量:宽表
21

22=now()
23for 10

=callRecord.sum(OUTID.BRANCHID.OUTCOST

+INID.BRANCHID.INCOST

+OUTID.AGENTID.OUTCOST+INID.AGENTID.INCOST)

24=interval@ms(A22,now())/SPL预关联13272ms
25

26=now()
27for 10

=callRecordWide.sum(OUTBRANCHOUTCOST

+INBRANCHINCOST+OUTAGENTOUTCOST

+INAGENTINCOST)

28=interval@ms(A26,now())/SPL宽表2210ms

可以看到,预关联比宽表慢6倍(13272/2210),相对于关联表比宽表慢的12.6倍,已经有较大幅度的提升。在宽表时,SPL计算性能和ORACLE几乎相同(2210:2055),但在有关联时,预关联的SPL计算速度已经明显超出临时关联的ORACLE了(13272:25802)。

需要注意的是,上述算法虽然使用了宽表做对比,但并不是说宽表可以代替关联表。事实上,宽表会浪费大量空间,还会造成创建、同步等维护困难,实际项目中很少用到。而预关联使用引用来建立关联,不会创造新表,不会浪费空间,不需要同步数据。


关联 性能 万条 影响 全局 动作 变量 成本 数据 用户 内存 代理商 字段 空间 算法 网点 代理 同步 明显 相同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技名片 青岛互联网科技公司 世界互联网领先科技成果 亿账通互联网科技 成都仁贤领冠互联网科技有限公司 老年人脱离互联网科技的作文 互联网实体化科技化 深圳市运趣互联网科技有限公司 顶级互联网科技成果有哪些 南山科技园互联网公司有哪些 互联网科技大赛获奖感言 为客找房互联网科技公司怎么样 山东有哪些互联网科技公司 产业互联网科技服务公司 上海创道互联网络科技有限公司 宁波跨境商互联网科技有限公司 江苏互联网智能科技产品出厂价 北京互联网科技类企业分布 杭州融税互联网科技有限公司 互联网科技创新方面的资料 山东特亿宝互联网科技有限公司 杭州互联网科技公司 万达互联网科技 中正互联网科技招聘 海南科技产业互联网平台 科技大学互联网 合肥互联网科技公司公章图片 美国互联网科技实力 互联网科技企业商标注意事项 如何强化互联网金融科技
0