网站首页 > 技术文章 正文
一、问题背景与适用场景
通常分组计算都采用 hash 方案,即先计算分组字段的 hash 值,hash 值相同的记录被分拣到一个小集合里,然后在这个小集合中遍历找分组字段值相同的聚合成一组。分组的复杂度 (比较次数),取决于 hash 函数的重码率。在 hash 空间比较小时,重码率就高,比较次数就会多,性能会受较大影响。为了提高性能,就需要分配较大的内存来存放 hash 表。另外,有些数据类型(长字串)的 hash 计算也比较慢,这也会影响性能。
如果分组字段是有序的,在分组的时候,每条记录只与上一条记录比较,发现有不同时则新建一个分组,相同则聚合到当前组中。这样的分组运算的复杂度为 n(被分组集合的长度),而且没有 hash 计算和重码率的问题,可以获得比 hash 分组更快的性能,而且并不需要太多内存用于存放 hash 表。
SPL 提供了这种分组方法,我们实例测试一下,并且与使用 hash 分组算法的 Oracle 对比。
二、测试环境
测试机有两个 Intel2670 CPU,主频 2.6G,共 16 核,内存 64G,SSD 固态硬盘。在此机上安装虚拟机来测试,设置虚拟机为 16 核、8G 内存。
三、小数据量小结果集测试
在虚拟机上创建数据表 orderdetail_1,共三个字段:orderid(整数)、detailid(整数)、amount(实数),前两个字段是主键,生成数据记录 8 千万行。将此表数据导入 Oracle 数据库,同时用它生成集算器 SPL 组表来进行测试。
orderid 字段数据升序排列,按 orderid 进行分组,共有 50 组,统计每张订单的总金额和明细条数。
1.Oracle 测试
编写查询测试 SQL 如下:
select /*+ parallel(n) */
orderid, sum(amount) as amount, count(detailid) as details
from orderdetail_1
group by orderid;
其中 /*+ parallel(n) */ 用于并行测试,n 为并行数。
2.SPL 测试
编写 SPL 脚本如下:
groups 分组时加选项 @o 就适用分组字段有序时,只比较相邻行的值进行有序分组。
3. 测试结果
测试结果如下,单位 (秒):
在 8 千万行数据的情况下,SPL 有序分组的性能提高了一倍左右,并且并行的效果非常好,性能呈线性上升。而使用 hash 分组的 Oracle 并行提速效果并不明显。
性能提高程序与数据量有关,当数据量很小时,分组时间占整个查询时间的比例很小,对整体性能的提高也就不明显。但随着数据量的增加,提升效果就会越来越显著。
下面我们再来看看大数据量测试的情况。
四、大数据量大结果集测试
在虚拟机上创建数据表 orderdetail_2,共三个字段:orderid(字符串)、detailid(整数)、amount(实数),前两个字段是主键,生成数据记录 24 亿行。将此表数据导入 Oracle 数据库,同时用它生成集算器 SPL 组表来进行测试。
orderid 字段数据升序排列,按 orderid 进行分组,共有 8 亿组,统计每张订单的总金额和明细条数。由于查询出的大结果集在 Oracle 输出需要很长的时间,所以对分组结果再进行一次过滤,只输出订单总金额小于 35 元的订单,结果只有 12 条,输出就几乎不占时间了。
1.Oracle 测试
编写查询测试 SQL 如下:
select * from (
select /*+ parallel(n) */
orderid, sum(amount) sum_amount, count(detailid) as details
from orderdetail_2
group by orderid
)
where sum_amount<35;
其中 /*+ parallel(n) */ 用于并行测试,n 为并行数。
2.SPL 测试
编写 SPL 脚本如下:
由于分组结果集很大,无法全部装载到内存,所以使用 group 函数进行有序分组,返回分组结果集对应的游标,再对游标过滤后取得需要的查询结果。
3. 测试结果
测试结果如下,单位 (秒):
在不并行的情况下,SPL 有序分组比 Oracle 性能提升了近 6 倍左右。因 SPL 有序分组方法很适合并行,随着并行数的增加,性能提升的效果就越好。
- 上一篇: 有关并行化——你知道的可能是错的
- 下一篇: RAC和OPS的区别 ras和rab
猜你喜欢
- 2024-11-02 Canal环境下,MySQL同步到Oracle串列问题的解决和控制
- 2024-11-02 裸设备和Oracle问答案例 oracle查看裸设备
- 2024-11-02 RAC和OPS的区别 ras和rab
- 2024-11-02 有关并行化——你知道的可能是错的
- 2024-11-02 HA DG RAC 三者的区别 ha和rac区别
- 2024-11-02 生产RAC数据库expdp导出报错?原来是并行度设置问题
- 2024-11-02 oracle和mysql的优缺点对比 oracle 和 mysql
- 2024-11-02 ORACLE学习笔记 之 merge开并行 oracle的merge语句
你 发表评论:
欢迎- 624℃几个Oracle空值处理函数 oracle处理null值的函数
- 616℃Oracle分析函数之Lag和Lead()使用
- 605℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 601℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 596℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 589℃【数据统计分析】详解Oracle分组函数之CUBE
- 577℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 565℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- 国产化红利到底在哪?好多人都在瞎折腾
- Oracle 推出 Java 24,增强 AI 支持和后量子加密
- JAVA桥接模式适用场景,优缺点是什么你知道吗,这篇文章彻底讲透
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
- Navicat Data Modeler使用教程十二:配置
- 软件测试|数据库的内连接,左连接,右链接分别是什么
- 每日学习“IT”是什么呢?(每日学习每日一词)
- SQLite:小众?其实它比你想象的更普及,连这个领域都有人用!
- 【推荐】一款实用且跨平台的数据库管理神器,支持Web浏览器
- Spring Batch中的JobRepository:批处理的“记忆大师”是如何工作
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)