其他
JDBC取数到底有多慢
数据库JDBC有多慢
数据来源
测试环境
数据库读数测试
A | B | |
1 | =now() | /记录时间 |
2 | =connect("oracle") | /连接数据库 |
3 | =A2.cursor("SELECT * FROM CUSTOMER") | /生成取数游标 |
4 | for A3,10000 | /循环取数,每次10000条 |
5 | =A2.close() | /关闭连接 |
6 | =interval@s(A1,now()) | /计算时长 |
测试结果:275秒
文本文件对比测试
只从上面的测试结果来看,还没有太多感性认识,我们再读一下文本文件来对比。办法是一样的,从文件中读出数据,并解析出记录,不作任何计算。
编写如下SPL脚本执行测试:
A | B | |
1 | =now() | /记录时间 |
2 | =file("customer.tbl") | /文件对象 |
3 | =A2.cursor(;,"|") | /生成取数游标,分隔符是| |
4 | for A3,10000 | /循环取数,每次10000条 |
5 | =interval@s(A1,now()) | /计算时长 |
测试结果:43秒
这意味着,读取文本要比读取Oracle快275/43=6.4倍。
我们知道,文本解析是个非常麻烦的事情,但即使这样,从文本文件读取数据还是远远快于从数据库中读数。
利用集算器 SPL并行提速
单表并行取数
A | B | |
1 | =now() | /记录时间 |
2 | =connect("oracle").query@ix("SELECT COUNT(*) FROM CUSTOMER")(1) | |
3 | >n=12 | /并行数 |
4 | =n.([int(A2/n)*(~-1),int(A2/n)*~]) | /按并行数分段区间 |
5 | fork A4 | =connect("oracle") |
6 | =B5.query@x("SELECT * FROM CUSTOMER WHERE C_CUSTKEY>? AND C_CUSTKEY<=?",A5(1),A5(2)) | |
7 | =A5.conj() | /合并结果 |
8 | =interval@s(A1,now()) | /计算时长 |
测试结果:28秒(非并行用时275秒)
多表并行取数
A | B | |
1 | SELECT * FROM SUPPLIER | |
2 | SELECT * FROM PART | |
3 | SELECT * FROM CUSTOMER | |
4 | SELECT * FROM PARTSUPP | |
5 | SELECT * FROM ORDERS | |
6 | =now() | /记录时间 |
7 | =connect("oracle") | /连接数据库 |
8 | =[A1:A5].(A7.query(~)) | /顺序执行每条SQL |
9 | >A7.close() | /关闭连接 |
10 | =interval@ms(A6,now()) | /计算时长 |
测试结果:360秒
11 | =now() | /记录时间 |
12 | fork [A1:A5] | =connect("oracle") |
13 | =B12.query@x(A12) | |
14 | =interval@ms(A11,now()) | /计算时长 |
测试结果:167秒
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^