当前位置: 首页 > ds >正文

28-Oracle 23ai Fast Ingest(Memoptimized Rowstore)高频写入

大家都是如何解决百万级TPS的高频写入场景的,当企业有了5G工厂(比如汽车主机厂、配件的产线,整条产线上的作业台和AGV小车),有了各种数采各式sensor数据(不大不小),大量高频写入的时候,是优选写入而后再校准,允许部分的不精准;还是保持ACID接收写入速率。

可以允许ACID中哪一个有缺失,还是成年人的世界,快、准,咱都要,是否有更好的平衡呢?

一、23ai 实现百万级TPS的高频写入

Oracle 23ai的Fast Ingest​(官方名称为 ​ Memoptimized Rowstore)是专为IoT、金融交易等高并发写入场景设计的核心技术。其核心架构分为三层:
  • 内存缓冲池(Memoptimized Pool)​
  • 在SGA中开辟独立内存区域
  • 写入时数据暂存于缓冲池,延迟写入避免直接触发磁盘I/O
  • 异步批量刷盘机制
  • - 由后台进程SMCO(Space Management Coordinator)和W001~W00x工作进程负责
  • 哈希索引加速定位
  • 通过内存哈希表快速定位缓冲数据,规避B+树锁竞争。
技术突破​:相比直接写入数据文件,Fast Ingest将事务提交延迟从毫秒级降至微秒级,TPS提升10倍以上

二、行业对比:其他解决方案

​数据库​

​技术方案

​局限性​

​Elasticsearch​

Translog + Refresh Interval

数据可见延迟高

​ClickHouse​

内存分区表 + 异步合并

不支持ACID事务

​Redis​

纯内存架构

数据持久化风险

​Oracle 23ai​

Memoptimized Pool

需预留专用内存

Oracle在保证ACID事务的前提下实现高频写入,而其他方案往往牺牲事务一致性或实时可见性 

三、版本演进:从Oracle 19c到23ai的升级之路

  • Oracle 19c
    • 仅支持基础异步写入
    • 首次引入Fast Ingest,但依赖LARGE POOL且无专用内存结构
  • Oracle 21c​:增强MEMOPTIMIZE FOR WRITE语法,支持表级启用
  • Oracle 23ai​:
    • 独立Memoptimized Pool区域
    • 支持AI Vector Search协同处理时序数据
    • 写入性能较19c提升40%,CPU开销降低25%

四、实践验证:测试Fast Ingest性能

​步骤1:启用Memoptimized Pool​
--要在CDB中设置,PDB中无法设置,RAC中所有节点要一致。
show parameter MEMOPTIMIZE;
SYS@FREE> show parameter MEMOPTIMIZE;NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memoptimize_pool_size                big integer 0
memoptimize_write_area_size          big integer 0
memoptimize_writes                   string      HINT
SYS@FREE>
--MEMOPTIMIZE 参数 ON/Hint(默认),是个静态参数SPFILE
alter system set memoptimize_writes = on SCOPE=spfile;
SYS@FREE> alter system set memoptimize_writes = on SCOPE=spfile;System altered.
--ALTER SYSTEM SET vector_memory_size=500M SCOPE=spfile;  -- 为AI向量预留内存
--ALTER SYSTEM SET memoptimize_pool_size=2G SCOPE=spfile; --这个和FAST INGEST无关
--设置area大小
ALTER SYSTEM SET MEMOPTIMIZE_WRITE_AREA_SIEZE=2G SCOPE=BOTH;
SYS@CDB$ROOT> alter system set memoptimize_write_area_size=2g scope=both;System altered.
SHUTDOWN IMMEDIATE; 
STARTUP;
--V$MEMOPTIMIZE_WRITE_AREA;
SYS@FREE> SELECT * FROM V$MEMOPTIMIZE_WRITE_AREA;TOTAL_SIZE USED_SPACE FREE_SPACE NUM_WRITES NUM_WRITERS     CON_ID
---------- ---------- ---------- ---------- ----------- ----------0          0          0          0           0          10          0          0          0           0          20          0          0          0           0          3

步骤2:创建支持Fast Ingest的表​ 

CREATE TABLE TEST_FAST_INGEST (id   NUMBER PRIMARY KEY,source      varchar2(100)
) MEMOPTIMIZE FOR WRITE;
--Table TEST_FAST_INGEST created.
--或者将原有的表alter修成MEMOPTIMIZE FOR WRITE--查询表的是否是MEMOPTIMIZE
SELECT TABLE_NAME,MEMOPTIMIZE_WRITE FROM USER_TABLES WHERE TABLE_NAME = 'TEST_FAST_INGEST';
SYS@CDB$ROOT> SELECT TABLE_NAME,MEMOPTIMIZE_WRITE FROM USER_TABLES WHERE TABLE_NAME = 'TEST_FAST_INGEST';TABLE_NAME          MEMOPTIMIZE_WRITE
___________________ ____________________
TEST_FAST_INGEST    ENABLED

步骤3:手动关闭后插入100w条数据 

--USE HINT 写入一条
INSERT /*+ MEMOPTIMIZE_WRITE */ INTO TEST_FAST_INGEST VALUES (1,'TEST1')
--ALTER SESSION INSERT
ALTER SESSION SET MEMOPTIMIZE_WRITES=ON;
INSERT INTO TEST_FAST_INGEST VALUES (2,'TEST2');--可以手工关闭 DISABLE MEMOPTIMIZE_WRITE FOR TABLE
ALTER TABLE test_fast_ingest NO MEMOPTIMIZE FOR WRITE;SYS@CDB$ROOT> ALTER TABLE test_fast_ingest NO MEMOPTIMIZE FOR WRITE;Table TEST_FAST_INGEST altered.Elapsed: 00:00:00.049
SYS@CDB$ROOT> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO TEST_FAST_INGEST (id, source)2  SELECT3      ROWNUM AS id,4      'SRC_' || TRUNC(DBMS_RANDOM.VALUE(1, 100)) AS source  -- 生成 SRC_1 到 SRC_99 的随机源5  FROM DUAL6* CONNECT BY LEVEL <= 1000000;1,000,000 rows inserted.Elapsed: 00:00:09.838
SYS@CDB$ROOT> SELECT * FROM V$MEMOPTIMIZE_WRITE_AREA;TOTAL_SIZE    USED_SPACE    FREE_SPACE    NUM_WRITES    NUM_WRITERS    CON_ID
_____________ _____________ _____________ _____________ ______________ _________282066944             0     282066944             0              1         3Elapsed: 00:00:00.019
-- 重新启用主键约束
ALTER TABLE TEST_FAST_INGEST MODIFY PRIMARY KEY ENABLE;

 步骤3、开启后插入100w条数据,查看AREA区域使用


-- 禁用约束加速写入(完成后需重新启用)
ALTER TABLE TEST_FAST_INGEST MODIFY PRIMARY KEY DISABLE;
-- 使用 CONNECT BY 语法批量生成
INSERT /*+ MEMOPTIMIZE_WRITE */ INTO TEST_FAST_INGEST (id, source)
SELECT ROWNUM AS id,'SRC_' || TRUNC(DBMS_RANDOM.VALUE(1, 100)) AS source  -- 生成 SRC_1 到 SRC_99 的随机源
FROM DUAL 
CONNECT BY LEVEL <= 1000000;--查看AREA使用
SYS@CDB$ROOT> SELECT * FROM V$MEMOPTIMIZE_WRITE_AREA;TOTAL_SIZE    USED_SPACE    FREE_SPACE    NUM_WRITES    NUM_WRITERS    CON_ID
_____________ _____________ _____________ _____________ ______________ _________282066944       1048576     281018368             0              1         3-- 重新启用主键约束
SYS@CDB$ROOT>
ALTER TABLE TEST_FAST_INGEST MODIFY PRIMARY KEY ENABLE;
--Table TEST_FAST_INGEST altered.

4、数据落盘

--数据写入的规则和设置使用DBMS_MEMOPTIMIZE Package的PL/SQL获得HWM高低水位线中的序列上、下限,DBMS_MEMOPTIMIZE WRITE_END Procedure将large pool中的当前会话数据全部落盘DBMS_MEMOPTIMIZE_ADMIN
将large pool中的当前LARGE POOL中的数据全部落盘包含所有的会话

五、应用场景:

工业物联网(IoT)、​​5G工厂

  • 万级传感器毫秒级数据采集

智能驾驶

  • 轨迹数据、ETC 高并发写入

六、技术平衡之道

Oracle 23ai通过Memoptimized Rowstore重新定义了高频数据写入,在ACID事务与极致性能间取得平衡。结合其新增的AI Vector Search,更可构建“写入-分析-决策”一体化架构。在设计IoT、实时分析系统时优先评估此特性。同样极致的性能风险性也需谨慎考虑。
Fast Ingest本质是用部分实时性换取吞吐量的工程妥协,其价值在IoT等场景不可替代,
需通过三层防御降低风险:
  1. 架构层​:Active Data Guard + 流处理前置缓冲
  2. 开发层​:写入前强制业务校验​(避免主键冲突)
  3. 运维层​:实时监控内存使用率

 

http://www.xdnf.cn/news/13837.html

相关文章:

  • 西电【信息与内容安全】课程期末复习笔记
  • jupyter notebook的相关知识及可能遇到的问题
  • LeetCode 2917.找出数组中的K-or值
  • Shell 脚本:系统管理与任务自动化的利器
  • docker compose安装Prometheus、Grafana
  • ubuntu网络连接失败 + mobaxterm拖拽文件出错等问题解决方法
  • CQL3D编译指南
  • PPIO 上线 Qwen3-Embedding 系列模型
  • C++学习-入门到精通【19】杂项汇总
  • 企业级人员评价系统Web端重构实战:前端架构效能升级
  • 【11408学习记录】考研数学核心突破:矩阵本质、系统信息与向量空间基
  • Linux系统lvm操作演示
  • 傲火集团传媒基地武汉启幕 构建数字娱乐产业生态闭环
  • 图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)
  • linux安装Redis6.0.8
  • 华为云物联网系统开发(纯云端)外包方案及项目需求说明书
  • PEP 8: E302 expected 2 blank lines, found 0
  • 在服务器上使用 Docker 部署 Node.js 后端服务和前端项目
  • 手写Antd的form组件源码
  • WPF调用Python心率监测脚本解决方案
  • 【iSAQB软件架构】以架构为中心的开发方法
  • 53. 最大的子数组和
  • iteration和每一轮,训练周期,迭代计数器 这些名词是什么关系?
  • 2025年中国人工智能发展研究报告:技术突破、行业变革与全球竞争新格局
  • ‘Target closed‘ error in Puppeteer解决
  • python打卡day52
  • 【GitOps】Kubernetes安装ArgoCD,使用阿里云MSE云原生网关暴露服务
  • 大数据学习(138)-Hive数据分析3
  • 利用Anything LLM和内网穿透工具在本地搭建可远程访问的AI知识库系统(1)
  • (十二)深度学习计算性能:硬件架构、算法效率与理论极限分析