Memoptimized Rowstore - Fast Ingest更新 (2023/01/31)

Memoptimized Rowstore - Fast Ingest更新 (2023/01/31)

https://blogs.oracle.com/in-memory/post/fast-ingest-updates

投稿者: Andy Rivenes | Product Manager


Memoptimized Rowstore Fast Ingest 機能は Oracle Database 19c で導入され、 2019 年 4 月にここでブログを書きました。それ以来、共有したい Fast Ingest 機能にいくつかの更新がありました。Oracle Database 19.16 および 21.3 から、LOB と暗号化のサポートが追加されました。


簡単に確認すると、Memoptimized Rowstore Fast Ingest 機能は、大量のデータロードを置き換えるものではありません。これは、やはりダイレクトパスロードで処理するのが最適です。Fast Ingest 機能は、挿入トランザクション自体のオーバーヘッドを削減し、集約において重要な価値を持つが必ずしも完全な ACID 要件を必要としない多くの情報データを生成するアプリケーションをサポートすることを目的としています。これは、ラージプールから割り当てられたメモリにデータを直接挿入することで実現されます。これらの挿入は、バックグラウンドプロセスによって非同期的にディスクに書き込まれます。挿入は元に戻すまたはやり直しによって保護されないため、挿入をロールバックすることはできず、データがディスクに書き込まれる前にインスタンスがダウンした場合、アプリケーションによって再挿入する必要があります。このアーキテクチャは、最大の取り込みスループットを達成するために作成されたため、通常の Oracle トランザクション処理をバイパスします。データがディスクに書き込まれたことを確認するために使用できる特別な「書き込み」API があり、これらの API を後でいくつかの例で使用します。


Fast Ingest 機能の特殊な性質のため、Fast Ingest でサポートされるデータの種類には多くの制限が課されていました。最大のものの 2 つは、LOB と暗号化のサポートでした。Oracle Database 19.16 および 21.3 から、これら 2 つの制限が削除されました。これがどのように機能するかを説明するために、Oracle Database 19.16 を使用した例をいくつか示します。


前回のブログと同じテーブル構造を使用して、TEST_COL 列を SecureFiles CLOB に変更し、Fast Ingest をテストします。また、LOB サポートはインライン LOBのみを対象としていることにも注意してください。


create table test_SF_fi (
  id number primary key,
  test_col CLOB )
  segment creation immediate
  tablespace TS_DATA
  LOB(test_col) STORE AS SECUREFILE(
    ENABLE STORAGE IN ROW
    NOCOMPRESS
    CACHE
  )
  memoptimize for write;


テーブルが作成されたら、MEMOPTIMIZE_WRITE ヒントを使用して、2 行のFast Ingest挿入のテストを実行できます。


SQL> insert /*+ memoptimize_write */ into test_SF_fi values (1, 'test');

1 row created.

SQL> insert /*+ memoptimize_write */ into test_SF_fi values (2, 'test');

1 row created.

SQL> select /*+ seqid session rows written to large pool */ to_number(dbms_memoptimize.GET_WRITE_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_WRITE_HWM_SEQID)
-----------------------------------------------
                                  1794603124645

SQL> select /*+ seqid rows written to disk */ to_number(dbms_memoptimize.GET_APPLY_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_APPLY_HWM_SEQID)
-----------------------------------------------
                                              0

SQL> exec dbms_memoptimize.write_end;

PL/SQL procedure successfully completed.

SQL> exec sys.dbms_session.sleep(10);

PL/SQL procedure successfully completed.

SQL> select /*+ seqid session rows written to large pool  */ to_number(dbms_memoptimize.GET_WRITE_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_WRITE_HWM_SEQID)
-----------------------------------------------
                                  1794603124645

SQL> select /*+ seqid rows written to disk  */ to_number(dbms_memoptimize.GET_APPLY_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_APPLY_HWM_SEQID)
-----------------------------------------------
                                  1794612887883

SQL>
SQL> select * from test_SF_fi;

              ID TEST_COL
---------------- ------------------------------------------
               1 test
               2 test

SQL>


この例で注意すべきことがいくつかあります。Fast Ingest ではコミットがサポートされていないため、コミットは発行されませんでした。MEMOPTIMIZE_WRITE ヒントの使用にも注意してください。


また、挿入されたデータがディスクに保持されていることを確認するために、DBMS_MEMOPTIMIZE 書き込み API 呼び出しを追加しました。


  1. DBMS_MEMOPTIMIZE.GET_WRITE_HWM_SEQID への最初のコールは、ラージプールのメモリに挿入した行に関連付けられたシーケンスを示します。DBMS_MEMOPTIMIZE.GET_APPLY_HWM_SEQID へのコールは、ディスクに書き込まれた行の最大シーケンス ID を示します。最初のシーケンス ID が 2 番目のシーケンス ID より大きいことに注意してください。実際、インスタンスが開始されてからまだデータがディスクに書き込まれていないため、これは 0 です。
  2. 次に、DBMS_MEMOPTIMIZE.WRITE_END 呼び出しを発行しました。これは、待つのが嫌で、すぐに書き込みを開始するようデータベースに指示したかったためです。あなたはこれをする必要はありませんが、私が言ったように、私はせっかちでした。
  3. 次に、sleep コマンドを発行して、データベースにデータをディスクに書き込む時間を与えました。
  4. 次に、シーケンス ID 呼び出しを再発行して、データが書き込まれたことを確認しました。このステップでは、ハイウォーターマークの適用シーケンスがハイウォーターマークの書き込みシーケンスよりも大きいことがわかります。
  5. 最後に、データにクエリを実行して、データが存在するかどうかを確認しました。持続性の究極のテスト。

一部のメカニズムが少しわかりにくい場合は、 DBMS_MEMOPTIMIZE パッケージがPL/SQL Packages and Types Referenceに記載されています。


Fast Ingest が LOB をサポートすることを示しました。暗号化はどうですか?次の例は、暗号化と Fast Ingest テストをセットアップする必要があるため、少し複雑です。暗号化は、表領域暗号化、列レベル暗号化およびSecureFiles暗号化でサポートされています。私は簡単な方法を取り、暗号化をサポートする表領域をセットアップしました。データベースの暗号化に慣れていない場合は、 Advanced Security Guideを参照して、その仕組みを学ぶことができます。


以下は、データベースで暗号化を設定し、キーストアを開いた後に使用したテーブルスペース定義です。


CREATE TABLESPACE encrypted_ts
DATAFILE SIZE 128K
AUTOEXTEND ON NEXT 64K
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);


この例では、最初のブログ投稿と同じ単純なテーブル定義を再度使用します。ただし、暗号化されたテーブルスペースに切り替えたことに注意してください。


create table test_encrypt_fi (
id number primary key,
test_col varchar2(15) )
segment creation immediate
tablespace encrypted_ts
memoptimize for write;


そして今、テスト:


SQL> insert /*+ memoptimize_write */ into test_encrypt_fi values (1, 'test');

1 row created.

SQL> insert /*+ memoptimize_write */ into test_encrypt_fi values (2, 'test');

1 row created.

SQL> select /*+ seqid session rows written to large pool  */ to_number(dbms_memoptimize.GET_WRITE_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_WRITE_HWM_SEQID)
-----------------------------------------------
                  2308680139702

SQL> select /*+ seqid rows written to disk  */ to_number(dbms_memoptimize.GET_APPLY_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_APPLY_HWM_SEQID)
-----------------------------------------------
                  2308680136692

SQL> exec dbms_memoptimize.write_end;

PL/SQL procedure successfully completed.

SQL> exec sys.dbms_session.sleep(10);

PL/SQL procedure successfully completed.

SQL> select /*+ seqid session rows written to large pool  */ to_number(dbms_memoptimize.GET_WRITE_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_WRITE_HWM_SEQID)
-----------------------------------------------
                  2308680139702

SQL> select /*+ seqid rows written to disk  */ to_number(dbms_memoptimize.GET_APPLY_HWM_SEQID) from dual;

TO_NUMBER(DBMS_MEMOPTIMIZE.GET_APPLY_HWM_SEQID)
-----------------------------------------------
                  2308689712017

SQL> select * from test_encrypt_fi;

          ID TEST_COL
---------------- ---------------
           1 test
           2 test

SQL>


幸いなことに、同じ肯定的な結果が得られました。なんらかの理由で行が挿入されなかった場合 (制約違反など)、アプリケーションの挿入は失敗しません。インデックス操作と制約チェックは、データがラージプールの高速取り込み領域からディスクに書き込まれるときにのみ実行されることを思い出してください。これは、書き込みおよび適用シーケンス ID を使用してチェックをコーディングし、行が実際に書き込まれたことを確認することが重要なもう 1 つの理由です。


この投稿が、Memoptimized Rowstore Fast Ingest 機能に追加された新しい LOB と暗号化のサポートを明確にするのに役立つことを願っています。


コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)