简介
Memoptimized Rowstore 为应用程序(如物联网(IoT)应用程序)提供了高性能数据流,这些应用程序通常以单行插入的方式同时从大量客户端流进少量数据,并以非常高的频率为客户端查询数据。
功能
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:
注意事项
注意:可以将表配置为同时使用 Fast Ingest 和 Fast Lookup。

