この記事はAndy RivenesによるNew in Oracle Database 19c: Memoptimized Rowstore – Fast Ingestを日本語に翻訳したものです。
2023年10月6日
Oracle Database 19c新機能の1つにMemoptimized Rowstore – 高速収集があります。 この機能は、Oracle Database への高速なデータ挿入を可能にするために追加されました。 その目的は、全体としては重要な価値を持つが、必ずしも完全なACID要件を必要としないデータを大量に生成するアプリケーションをサポートできるようにすることでした。 モノのインターネット(IoT)のようなアプリケーションでは、高速な”fire and forget”タイプのワークロードに意味があります。例えば、センサーデータ、スマート メーターのデータ、さらには交通カメラのデータをあとで分析するために大量に収集し、データベースに書き込みます。
次の図で、Memoptimized Rowstore – 高速収集機能がどのように動作するか示しています:

重要な点として、取り込まれたデータがラージ・プール内にまとめられ、すぐには書き込まれないため、取り込み処理が非常に高速であることです。 これよって、個々の行を処理することなく非常に大量のデータを効率的に取り込むことができます。 ただし、取り込まれたデータがデータベース・ファイルに書き出される前にデータベースがダウンした場合、データが失われる可能性があります。 これはデータがログに記録され、データベースにデータが一度”書き込まれる(コミットされる)”とデータが失われないOracle Databaseの通常のトランザクション処理と大きく違います。書き込み検証API(Write verification API)という破線があるのもそのためです。 最大限の収集処理能力を実現するために、通常のトランザクション・メカニズムはバイパスされます。 すべてのデータが実際にデータベースに書き込まれたかどうかはアプリケーション側で確認する必要があります。 データがデータベースに書き込まれたかどうかを確認するために呼び出すことができる、特別なAPIが追加されました。
Memoptimized Rowstore – 高速収集機能を利用するには、まずMEMOPTIMIZE FOR WRITE句を追加したCRATE TABLE文やALTER TABLE文で1つ以上の表の高速収集を有効にする必要があります。以下に例を示します:

高速収集をINSERTで利用する場合、MEMOPTIMIZE_WRITEヒントをINSERT文に追加する必要があります。MEMOPTIMIZE_WRITEヒントを利用していくつかの行を挿入してみましょう:

かなりくだらない例だが、仕組みを表現しています。ただし、この機能の本来の使用方法ではありません。 Memoptimized Rowstore – 高速収集機能の目的は、高速なデータストリーミングをサポートすることであり、より現実的なアーキテクチャではデータを収集し、まとめてデータベースへ挿入する1つ以上のアプリケーションまたは取り込み用のサーバーが含まれます。今回は説明用に個別の挿入例を続けます。
初めてINSERTが実行されるとき、高速収集用の領域がラージ・プールから割当られることに注意してください。割当てられたメモリ量は次のようなフォーマットでアラートログに書き込まれます:
2018-09-04T15:43:43.667014-07:00
Memoptimize Write allocated 884M from large pool
2つのINSERT処理で、SGA内のラージ・プールの収集バッファにデータが書き込まれます。そのデータはある時点でTEST_FAST_INGESTテーブルに書き出されます。書き出しが起こるまで、データは永続化されていません。データベースがクラッシュした場合、高速収集バッファからディスクに書き出されなかったデータは失われます。これは重要な違いだと思います。
コミットはどうなりますか?高速収集挿入の文脈では、これまでのOracleのトランザクション処理ではないので、コミットには意味がありません。 INSERTをロールバックする機能はありません。また、データが高速収集バッファからディスクに書き出されるまで、データを検索できません。 V$MEMOPTIMIZE_WRITE_AREAビューから、高速収集バッファに関する管理情報を確認できます。 以下では、行を挿入した後にラージ・プール内の高速収集データを確認する例を示しています:

DBMS_MEMOPTIMIZEおよびDBMS_MEMOPTIMIZE_ADMINパッケージを使用して、ラージ・プールからの高速収集データの書き出しや、書き込まれたデータの順序IDの決定などの機能を実行することもできます。
索引操作および制約チェックは、データがラージ・プール内の高速収集領域からディスクに書き込まれるときにのみ実行されます。 バックグラウンド・プロセスでデータがディスクに書き込まれるときに主キー違反が発生した場合は、データベースによってこれらの行がデータベースに書き込まれることはありません。 すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションのINSERT処理で、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、INERT処理からデータを削除できます。
要するに、Memoptimized Rowstore – 高速収集機能は高速な”fire and forget”方式でデータをOracle Databaseに迅速に取り込む機能を提供し、全体としては重要な価値のある非常に大量なデータをアプリケーションが処理できるようにするということです。ただし、すべてのトランザクションをキャプチャする必要はありません。