體驗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.pswp.cn/diannao/77504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77504.shtml
英文地址,請注明出處:http://en.pswp.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 - 語言:中文## 注意事項: 保持客觀公正態度,用數據說話,給出具體的…