Oracle:19c 新特性——Memoptimized Rowstore 简介

来源:这里教程网 时间:2026-03-03 17:30:18 作者:

简介

Memoptimized Rowstore 为应用程序(如物联网(IoT)应用程序)提供了高性能数据流,这些应用程序通常以单行插入的方式同时从大量客户端流进少量数据,并以非常高的频率为客户端查询数据。

功能

  • Fast Ingest Fast Ingest 优化了对数据库中高频单行数据插入的处理。Fast Ingest 在将插入写入磁盘之前使用 large pool 缓冲数据,从而提高数据插入性能。
  • Fast Lookup Fast Lookup 支持从数据库中 Fast Lookup 数据以进行高频查询。Fast Lookup 在 SGA 中使用一个称为 memoptimize pool 的单独内存区域来缓冲从表查询的数据,从而提高查询性能。

    Fast Ingest

    原理

    Fast Ingest 的目的是支持那些生成大量信息数据的应用程序,这些数据在聚合中具有重要价值,但不一定需要完全的 ACID要求。物联网(IoT)中的许多应用都有一个快速的“火了就忘了”类型的工作量,比如传感器数据、智能仪表数据,甚至交通摄像头。对于这些应用程序,可能会收集大量数据并将其写入数据库,以便以后进行分析。

    下图展示了如何使用 Memoptimized Rowstore - Fast Ingest 特性。

    摄取的数据在 large pool 中进行批处理,不会立即写入数据库。因此,摄取过程非常快。可以有效地摄取非常大量的数据,而不必处理个别的行。但是,如果在将摄取的数据写入数据库文件之前数据库就关闭了,则可能会丢失数据。

    Fast Ingest 与正常的 Oracle 数据库事务处理有很大的不同,在正常的 Oracle 数据库事务处理中,数据被记录下来,并且一旦写入数据库(即提交)就不会丢失。为了实现最大的吞服吞吐量,一般的 Oracle 事务机制将被绕过,应用程序的责任是检查所有数据是否确实被写入数据库。添加了特殊的 API,可以调用这些 API 来检查数据是否已经写入数据库。

    Commit 操作在 Fast Ingest 摄取上下文中没有意义,因为它不是传统 Oracle 意义上的事务。没有回滚插入的能力。在将数据从 Fast Ingest 摄取缓冲区刷新到磁盘之前,您也无法查询数据。通过查询 V$MEMOPTIMIZE_WRITE_AREA 视图,你可以看到一些关于 Fast Ingest 缓存的管理信息。

    您还可以使用包 DBMS_MEMOPTIMIZE 和 DBMS_MEMOPTIMIZE_ADMIN 来执行一些功能,比如从 large pool 中 Fast Ingest 数据并确定已写入数据的序列 id。

    只有当数据从 large pool 中的 Fast Ingest 区域写入到磁盘时,才会执行索引操作和约束检查。如果在后台进程将数据写入磁盘时发生主键冲突,那么数据库将不会将这些行写入数据库。

    假设(对于大多数应用程序,但不是所有应用程序)所有插入的数据都需要写入数据库,那么应用程序插入进程必须在销毁数据之前检查插入的数据是否已经实际写入数据库。只有当确认发生时,数据才能从插入过程中删除。

    限制

    具有以下特征的表不能使用 Fast Ingest:

  • 磁盘压缩
  • 内存压缩
  • 列的默认值
  • 加密
  • 函数索引
  • 域的索引
  • 位图索引
  • 位图连接索引
  • ref类型
  • varray类型
  • OID美元类型
  • 未使用的列
  • 虚拟列
  • lob
  • 触发器
  • 二进制文件列
  • 外键
  • 行归档
  • 看不见的列
  • 临时表
  • 嵌套表
  • 索引组织表
  • 外部表
  • 按需刷新的物化视图
  • 不支持子分区。
  • 不支持以下分区类型
  • REFERENCE
  • SYSTEM
  • INTERVAL
  • AUTOLIST

    注意事项

  • 因为 Fast Ingest 摄取 large pool 中的数据,所以在系统故障时有可能丢失数据。为了避免数据丢失,客户端必须在执行插入操作后保留数据的本地副本,以便在将数据写入磁盘之前,在系统出现故障时可以重放插入操作。客户机可以使用DBMS_MEMOPTIMIZE包子程序来跟踪插入的持久性。插入数据写入磁盘后,客户端可以销毁插入数据的本地副本。
  • 查询不会从 large pool 中读取数据,因此,在将使用 Fast Ingest 的数据写入磁盘之前,无法查询使用 Fast Ingest 的数据。
  • 父-子事务必须同步以避免错误。例如,如果父数据尚未写入磁盘,则插入到 large pool 中的行的外键插入和更新可能返回错误。
  • 与常规插入类似,Fast Ingest 支持索引操作。但是,对于 Fast Ingest,数据库在将数据写入磁盘时执行索引操作,而不是在将数据写入 large pool 时执行索引操作。
  • JSON 只支持存储为 4K VARCHAR2,而不支持存储为 LOB。不支持扩展的 32K 字符串长度(即max_string_size= Extended)。
  • 分配给 large pool 中 Fast Ingest 摄取缓冲区的大小在创建后就固定了。如果缓冲区填满,则进一步摄取将等待后台进程耗尽缓冲区。

    注意:可以将表配置为同时使用 Fast Ingest 和 Fast Lookup。

  • 相关推荐