体验OceanBase的 并行导入功能

在数据库的日常使用中,会经常遇到以下场景:

  • ‌数据复制‌:将一个或多个表中的数据复制到目标表中,可能是复制全部数据,也可能仅复制部分数据。
  • 数据合并:将数据从一个表转移到另一个表,或者将多个表的数据合并为一个表
  • ‌表备份‌:常用于备份表数据,以防止在修改或删除数据时出现问题,需要还原数据的情况。
  • 数据加工:将当前数据按照特定规则进行处理,并将处理后的数据放入一个新的表中。

OceanBase 支持并行导入功能,其并行执行框架能够并发执行DML语句(即Parallel DML),使得在多节点数据库环境中能够实现跨节点的并发写入,同时,它还能确保大事务的一致性。现在,让我们通过实验来体验OceanBase的并行导入能力。

一、准备环境

我准备了两套环境一套单节点的,一套1-1-1的集群

单节点:8C16G

集群:4C10G*3 (吐槽一下太费资源了,试验机快冒烟了/(ㄒoㄒ)/~~)

二、准备表结构和数据

找了一张经常使用的表修改为oceanbase脚本

表结构:

 CREATE TABLE `test_bingxing` (         `fzssuuid` bigint AUTO_INCREMENT          ,    `jcxxuuid` varchar(32)  NOT NULL                ,    `gtfwwrfzsslbdm` char(1)  NULL DEFAULT NULL        ,    `cshssmc` text  NULL                               ,    `zxxzm_dm` char(16)  NULL DEFAULT NULL              ,    `gtfwly_dm` char(1)  NULL DEFAULT NULL             ,    `zhlycw` text  NULL                                ,    `werjbqk` longtext  NULL                          ,    `lrrq` datetime NOT NULL                           ,    `lrr_dm` char(11)  NOT NULL                        ,    `xgrq` datetime NULL DEFAULT NULL                  ,    `sjgsdq` char(11)  NOT NULL                        ,    `sjtb_sj` datetime NULL DEFAULT NULL               ,`zhlyhcsdfg` decimal(18, 6) NULL DEFAULT NULL  ,`zhlyzyfss_dm` varchar(45)  NULL DEFAULT NULL      ,    `ssbm` varchar(45)  NULL DEFAULT NULL              ,    `yxbz` char(1)  NULL DEFAULT NULL                  ,    `sjblbz` decimal(2, 0) NULL DEFAULT NULL           ,    PRIMARY KEY (fzssuuid)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = COMPACT COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384;

准备造数脚本:

写了一个简单的python造数脚本仅供参考,构造500万左右的数据

import random
import string
import pymysql
import time
import datetime
import multiprocessing 
import threading   #   数据生成部分------------公共------------------------------------------------------------------------------------------------------------------------------(始)
# 随机时间 2000年-2023年
class CreateData(object):def randdatetime(self):mintime = datetime.datetime(2000, 1, 1, 0, 0, 0)maxtime = datetime.datetime(2023, 12, 31, 23, 23, 59)mintime_ts = int(time.mktime(mintime.timetuple()))maxtime_ts = int(time.mktime(maxtime.timetuple()))random_ts = random.randint(mintime_ts, maxtime_ts)randomtime = datetime.datetime.fromtimestamp(random_ts)# print(randomtime)return (randomtime)# # 获取fundid随机6位,乙级差不多相同会又1000左右def get_fundid(self):fundid = '25010'for ii in range(6):fundid += str(random.randint(0, 9))return fundid# 生成数据def get_one_data(self,xh):matchsno = 1000000+xh# 此处返回的数据顺序最好与创建表时的结构顺序一致,以便插入数据时一一对应aa=["dsdfsdf","Y",self.get_fundid(),"WRFG3452","Y",self.get_fundid(),"FTERGDFFSGHTRT324RDAFAGDA",self.randdatetime().strftime('%Y-%m-%d %H:%M:%S'),"12032032",self.randdatetime().strftime('%Y-%m-%d %H:%M:%S'),"中国",self.randdatetime().strftime('%Y-%m-%d %H:%M:%S'),"1232143.12","sadfkjjdfw231","dsfwer23Dcxf","n","1"]return aadef insert_data(tablename,*args):get_conn = pymysql.connect(host="192.168.150.117",user="banjin",password="oracle123",port=2881,database="test")   # 连接数据库get_cursor = get_conn.cursor()  # 获取游标str_sql = "insert into {0}(jcxxuuid,gtfwwrfzsslbdm,cshssmc,zxxzm_dm,gtfwly_dm,zhlycw,werjbqk,lrrq,lrr_dm,xgrq,sjgsdq,sjtb_sj,zhlyhcsdfg,zhlyzyfss_dm,ssbm,yxbz,sjblbz) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);".format(tablename)   # 定义SQL语句get_cursor.executemany(str_sql,args)    # 批量执行SQL语句get_conn.commit()    # 提交保存数据
#     # 定义一个关闭对象的方法get_conn.close()# print(str_sql)
# # 测试代码
# #生成数据当前批量写入,三个线程,需手工大致画区间
if __name__ == "__main__":createdata = CreateData()   # 实例化CreateData类方法list1 = []for i in range(1,5000000):  # 循环1000000次,生成1000000条数据get_one = createdata.get_one_data(i)    # 调用CreateData类的get_one_data方法list1.append(get_one)   # 在list1列表中插入get_one列表(一行数据)start_time = time.time()print("执行程序开始时间:",start_time)p1 = multiprocessing.Process(target=insert_data,args=("`test_bingxing`",*list1[:1800000]))p2 = multiprocessing.Process(target=insert_data,args=("`test_bingxing`",*list1[1800001:3600000]))p3 = multiprocessing.Process(target=insert_data,args=("`test_bingxing`",*list1[3600001:]))p1.start()p2.start()p3.start()p1.join()p2.join()p3.join()end_time = time.time()print("执行程序结束时间:", end_time)print("执行程序总耗费时间:",end_time - start_time) #时间统计为脚本数据库执行时间,不包含脚本生成数据时间

三、并行导入验证

测试脚本

set ob_query_timeout = 1000000000;  
set ob_trx_timeout = 1000000000; insert into test_bingxing1 select * from test_bingxing;truncate table test_bingxing1;
insert /*+ parallel(8) enable_parallel_dml */ into test_bingxing1 select * from test_bingxing;

1、单机环境

先不开启并行的方式插入,然后清空数据添加一个 Hint,开启 PDML 的执行选项,执行结果如下:

1729226929

非并行插入时间消耗两分多,并插入时间相差不多

2、集群环境

先不开启并行的方式插入,然后清空数据添加一个 Hint,开启 PDML 的执行选项,执行结果如下:

1729226961

非并行插入时间消耗六分多,并插入时间差不多节约一半,(集群环境因为电脑没有空间了,外插了一块老的移动硬盘,写入速度有点慢)

3、执行计划对比

未开启并行导入的执行计划

1729232455

开启并行导入的执行计划,可以看到使用了并行算子

1729232536

四、总结

并行插入可以实现更高效的数据插入,因为实验环境是虚拟机,磁盘都是一块,性能提升没有官网文档说明的那么大,有条件的伙伴可以用真实环境进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka和RocketMQ相比有什么区别?那个更好用?

Kafka和RocketMQ相比有什么区别?那个更好用? Kafka 和 RocketMQ 都是广泛使用的消息队列系统,它们有很多相似之处,但也有一些关键的区别。具体选择哪个更好用,要根据你的应用场景和需求来决定。以下是它们之间的主要区别: 1. …

UniApp 实现兼容 H5 和小程序的拖拽排序组件

如何使用 UniApp 实现一个兼容 H5 和小程序的 九宫格拖拽排序组件&#xff0c;实现思路和关键步骤。 一、实现目标 支持拖动菜单项改变顺序拖拽过程实时预览移动位置拖拽松开后自动吸附回网格兼容 H5 和小程序平台 二、功能结构拆解以及完整代码 完整代码&#xff1a; <…

[raspberrypi 0w and respeaker 2mic]实时音频波形

0. 环境 ubuntu22主机&#xff0c; 192.168.8.162&#xff0c; raspberry 0w&#xff0c; 192.168.8.220 路由器 1. 树莓派 # rpi - send.py # 或者命令行&#xff1a;arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…

公司内部建立apt源

有一篇建立pypi源的在这里需要的可以查看&#xff1a;公司内部建立pypi源-CSDN博客 背景&#xff0c;公司内部有很多工具仅供内部使用&#xff0c;如果用apt的方式就比较方便&#xff0c;只需要修改sources.list将源添加进去就可以了。我们接下来的操作就是为了实现这个需求。…

UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题

【[metablriger] UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题】 UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题

AWS Bedrock生成视频详解:AI视频创作新时代已来临

💡 TL;DR: AWS Bedrock现已支持AI视频生成功能,让企业无需深厚AI专业知识即可创建高质量视频内容。本文详解Bedrock视频生成能力的工作原理、应用场景和实操指南,助你快速掌握这一革命性技术。 🎬 AWS Bedrock视频生成:改变内容创作的游戏规则 还记得几年前,制作一个专…

1.2 测试设计阶段:打造高质量的测试用例

测试设计阶段&#xff1a;打造高质量的测试用例 摘要 本文详细介绍了软件测试流程中的测试设计阶段&#xff0c;包括测试用例设计、测试数据准备、测试环境搭建和测试方案设计等内容。通过本文&#xff0c;读者可以系统性地了解测试设计的方法和技巧&#xff0c;掌握如何高效…

jQueryHTML与插件

1.jQuery 事件机制 1.1 注册事件 bind()、on()方法向被选元素添加一个或多个事件处理程序&#xff0c;以及当事件发生时运行的函数 $("p").on({"click": function () {alert("点击了")},"mouseenter": function () {…

MySQL 触发器与存储过程:数据库的自动化工厂

在数据世界的工业区&#xff0c;有一座运转高效的自动化工厂&#xff0c;那里的机器人日夜不停地处理数据…这就是 MySQL 的触发器与存储过程系统&#xff0c;它让数据库从"手工作坊"变成了"现代化工厂"… 什么是 MySQL 触发器与存储过程&#xff1f;&…

PostgreSQL-中文字段排序-修改字段的排序规则

最新版本更新 https://code.jiangjiesheng.cn/article/365?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 -- 修改字段的排序规则 ALTER TABLE "public"."your_table_name" ALTER COLUMN "name" TYPE varcha…

GitHub优秀项目:数据湖的管理系统LakeFS

lakeFS 是一个开源工具&#xff0c;它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS&#xff0c;可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…

页面编辑器CodeMirror初始化不显示行号或文本内容

延迟刷新 本来想延迟100毫秒的&#xff0c;但是会出现样式向左偏移的情况&#xff0c;于是试了试500毫秒&#xff0c;发现就没有问题了&#xff0c;可能是样式什么是需要一个加载过程吧。 useEffect(() > {editorRef.current?.setValue(value || );setTimeout(() > {edi…

使用 Spring Boot 和 Uniapp 搭建 NFC 读取系统

目录 一、NFC 技术原理大揭秘1.1 NFC 简介1.2 NFC 工作原理1.3 NFC 应用场景 二、Spring Boot 开发环境搭建2.1 创建 Spring Boot 项目2.2 项目基本配置 三、Spring Boot 读取 NFC 数据3.1 NFC 设备连接与初始化3.2 数据读取逻辑实现3.3 数据处理与存储 四、Uniapp 前端界面开发…

台式电脑插入耳机没有声音或麦克风不管用

目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…

Gerrit的安装与使用说明(Ubuntu)

#本页面按192.168.60.148服务器举例进行安装配置 1.权限配置 ## 使用root或者有sudo权限用户执行 # 创建gerrit用户 sudo useradd gerrit # 设置gerrit用户的密码 sudo passwd gerrit # 增加sudo权限 sudo visudo 在root ALL(ALL:ALL) ALL行下添加如下内容 gerrit ALL(ALL:…

Visual Studio 2019 配置VTK9.3.1

文章目录 参考博客1、 VTK下载和编译2、vs2019配置vtk9.3.1参考博客 Visual Studio 2022 配置VTK9.3.0 1、 VTK下载和编译 见博客 CMake编译VTK 2、vs2019配置vtk9.3.1 新建一个项目 写入以下代码 #include <vtkActor.h> #include <vtkAssembly.h> #include…

C++进阶——C++11_右值引用和移动语义_可变参数模板_类的新功能

目录 1、右值引用和移动语义 1.1 左值和右值 1.2 左值引用和右值引用 1.3 引用延长生命周期 1.4 左值和右值的参数匹配 1.5 右值引用和移动语义的使用场景 1.5.1 左值引用主要使用场景 1.5.2 移动构造和移动赋值 1.5.3 右值引用和移动语义解决传值返回问题 1.5.4 右值…

HTTP协议原理深度解析:从基础到实践

引言 在互联网技术体系中,HTTP(HyperText Transfer Protocol)协议如同数字世界的"通用语言",支撑着全球超50亿网民的日常网络交互。作为爬虫开发、Web应用构建的核心技术基础,理解HTTP原理是每个开发者必须掌握的技能。本文将从协议本质、技术演进、安全机制三…

Web品质 - 重要的HTML元素

Web品质 - 重要的HTML元素 在构建一个优秀的Web页面时,HTML元素的选择和运用至关重要。这些元素不仅影响页面的结构,还直接关系到页面的可用性、可访问性和SEO表现。本文将深入探讨一些关键的HTML元素,并解释它们在提升Web品质方面的重要性。 1. <html> 根元素 HTM…

【AI提示词】竞品分析专家

提示说明 对产品进行竞品分析&#xff0c;明确产品定位和优化营销策略。 提示词 # 角色:竞品分析专家## 背景: 需要对旗下产品A进行竞品分析,明确产品定位和优化营销策略。## 描述: - 作者:张三 - 版本:1.0 - 语言:中文## 注意事项: 保持客观公正态度,用数据说话,给出具体的…