性能优化技巧:前半有序时的排序
一、问题背景与适用场景
在对数据集进行排序运算时 , 有时会遇到这样一种场景:数据集T已经按字段a有序 , 而字段b无序 , 现在我们要将T按a、b排序 , 我们称之为前半有序(a有序)的排序 。 此时我们能想到一种优化的排序方法:从T中先取出a值相同的一组记录 , 再这一组内对b排序 。 然后再依次取出下一组a值相同的记录 , 重复这个动作 , 直到完成T中所有记录的排序 。 这种方法的好处是不需要对T中所有记录进行大排序 , 一次只需取出一小组 , 对内存容量要求大大减低 , 只需能装下每个小组即可 。
遗憾的是SQL并不支持这种优化算法 , 只能所有记录进行大排序 , 而SPL提供了对这种算法的支持 , 下面我们实例测试一下 , 并与Oracle作对比 。
二、测试环境与任务
测试机有两个Intel2670CPU , 主频2.6G , 共16核 , 内存64G , SSD固态硬盘 。 在此机上安装虚拟机来测试 , 设置虚拟机为16核、8G内存 。
在虚拟机上创建数据表salesman1 , 共两个字段:area(字符串)、salesman(字符串) , 生成数据记录4亿行 , 按area升序排列 , area不同值共2000个 , 每个area对应salesman为20万个 。 将此表数据导入Oracle数据库 , 同时用它生成集算器SPL组表来进行测试 。
再建另一张表salesman2作大数据量测试 , 数据表结构不变 , 总数据记录20亿行 , area值4000个 , 每个area对应50万个salesman 。
测试任务都是要对表按照area、salesman排序 。
三、小数据量测试
1.Oracle测试
编写测试SQL如下:
selectarea,salesmanfromsalesman1orderbyarea,salesman
本来只需这一句简单的SQL即可 , 不过这个排序结果的输出时间却非常长 , 为了减少输出量 , 只统计排序过程的用时 , 我们不输出排序后的全部结果 , 而只输出中间位置的一行 , 也就是行号为2亿的那一行 , 所以SQL语句改写如下:
selectarea,salesmanfrom(
selectarea,salesman,rownumrnfrom(
selectarea,salesmanfromsalesman1orderbyarea,salesman
)
)wherern=200000000;
要多说一句 , 这个查询其实没有什么业务意义 , 纯粹是为了迫使数据库大排序且避免统计输出时间的 。
【性能优化技巧:前半有序时的排序】2.SPL测试
编写SPL脚本如下:
文章图片
group@qs中选项s表示对数据集只排序 , 不分组;选项q表示数据集对分号前的分组表达式(area)是有序的 , 请求使用前半有序时的排序方法按分号后的表达式(salesman)排序 。
四、大数据量测试
1.Oracle测试
编写测试SQL如下:
selectarea,salesmanfrom(
selectarea,salesman,rownumrnfrom(
selectarea,salesmanfromsalesman2orderbyarea,salesman
)
)wherern=1000000000;
输出行号为10亿的一行 。
2.SPL测试
编写SPL脚本如下:
文章图片
五、测试结果
测试结果如下 , 单位(秒):
文章图片
从测试结果看 , SPL前半有序排序与Oracle的大排序相比 , 数据量4亿行时 , 运行时间只有60% , 20亿行时只有50% , 可见性能提升很多 , 数据量越大时效果越显著 。
- 最新软装设计实用技巧,建议收藏
- 红魔6Pro高刷游戏及性能实测:王者吃鸡原神全程高能
- 猫咪|猫咪能活多久?5个饲养小技巧让你的猫咪更长寿
- 暗黑2魔电西格玛2019资料技巧整理:红门篇
- 虎鲨战机曾被重点关注,整体性能强大,关键技术长期禁售!
- 因入选全明星有优势 保罗&东契奇技巧赛首轮轮空
- 算法竞赛专题解析│四边形不等式优化
- 原神登龙剑手机端怎么操作?原神登龙剑手机操作技巧
- 手机性能榜大洗牌:红米K40位列第六,小米11第四,第一是vivo!
- 露娜限定皮肤5号上线,祈雪灵祝优化完成,嫦娥喜获6元典藏皮肤?
