外部表キャッシュを使用した問合せパフォーマンスの向上

Autonomous AI Database on Dedicated Exadata Infrastructureでは、外部表キャッシュを使用して、データベース内の外部表からデータをキャッシュできます。

外部表キャッシュは、データベース内のスキーマ・オブジェクトとして作成され、表および索引がデータファイルに格納される方法と同様の物理領域が割り当てられます。外部表キャッシュを作成すると、スキーマに新しい表が作成され、スキーマに設定された領域割当て制限も外部表キャッシュに適用されます。

Autonomous AI Databaseの外部表キャッシュについて

外部表キャッシュは、外部表からのデータを格納するAutonomous AI Databaseのストレージ領域です。

外部データはデータベースによって管理されませんが、外部表を使用してデータベース外部のデータを問い合せることができます。外部表に対する問合せは、データベース表に対する問合せほど高速ではありません。データにアクセスするたびに、オブジェクト・ストアに格納されている外部ファイルからフェッチする必要があるためです。

外部表キャッシュ機能を使用すると、自律型AIデータベース内の外部表から頻繁にアクセスされるデータをキャッシュできます。データにアクセスするアプリケーションを変更する必要がないため、外部表へのアクセスを高速化できます。

外部表キャッシュを使用する利点の一部を次に示します。

次のファイル・タイプで作成したパーティション表および非パーティション表の外部表キャッシュを作成できます。

詳細は、外部データ問合せを参照してください。

前提条件

外部表キャッシュを作成するための前提条件をリストします。

制限事項

Autonomous AI Databaseでの外部表キャッシュの使用に関する重要なノートおよび制限を示します。

外部テーブル・キャッシュの作成

DBMS_EXT_TABLE_CACHE.CREATE_CACHEを実行して、外部表キャッシュを作成します。

キャッシュが作成されると、最初は空になり、移入が有効になります。キャッシュ・サイズは、割り当てられた制限に達するまで、スキーマに定義された領域割当て制限に応じて、ファイルを追加するたびに増加します。詳細は、「外部表キャッシュのオプション・サイズ設定プリファレンスの設定」を参照してください。

  1. DBMS_EXT_TABLE_CACHE.CREATE_CACHEを使用して、スキーマの外部表キャッシュを作成します。たとえば:

     BEGIN
         DBMS_EXT_TABLE_CACHE.CREATE_CACHE (
           owner          => 'SALES',
           table_name     => 'STORE_SALES',
           partition_type => 'PATH');
     END;
     /
    

    これにより、SALESスキーマにSTORE_SALES表のキャッシュが作成されます。STORE_SALESは、オブジェクト・ストアに格納されているデータを指す外部表です。

    ownerパラメータでは、スキーマ名を指定します。この例では、SALESユーザーの外部表キャッシュを作成します。

    partition_typeパラメータは、外部表キャッシュに使用するパーティション化方法を指定します。この例では、FILE$PATH列を使用してキャッシュをパーティション化します。FILE$PATHは、オブジェクト名の先頭までのファイル・パス・テキストを指定する非表示列です。

    詳細は、外部表のメタデータ列およびCREATE_CACHEプロシージャを参照してください。

  2. 最初に外部表キャッシュを作成すると、そのメタデータはデータ・ディクショナリに格納されます。ただし、キャッシュ・データには領域は割り当てられません。USER_EXTERNAL_TAB_CACHESビューを問い合せて、キャッシュの作成を確認できます。

     SELECT external_table_name, cached, disabled
       FROM user_external_tab_caches;
    

    詳細は、「DBA_EXTERNAL_TAB_CACHESビューおよびUSER_EXTERNAL_TAB_CACHESビュー」を参照してください。

    DBMS_EXT_TABLE_CACHE.VALIDATEプロシージャを使用して、外部表キャッシュを検証します。参照先の外部表がデータベースに見つからない場合は、エラーが報告されます。

    たとえば:

     BEGIN
       DBMS_EXT_TABLE_CACHE.VALIDATE (
         owner         => 'SALES',
         table_name    => 'STORE_SALES',
         raise_errors  => TRUE);
     END;
     /
    

    詳細は、VALIDATEプロシージャを参照してください。

外部表キャッシュへのファイルの移入

ファイルを外部表キャッシュに移入する例を示しています。

キャッシュを作成した後、ファイルをキャッシュに移入できます。ファイルへの移入では、指定された外部表ファイルの内容がキャッシュにロードされます。表からすべてのファイルを移入するか、表の特定のパーセンテージを移入するか、移入するファイルを制限するフィルタ条件を指定できます。たとえば、ファイル名または日付範囲に基づいてファイルをフィルタできます。

スキーマに割り当てられた領域割当て容量に応じて、Oracleはファイルをキャッシュに移入しようとします。割り当てられた割当て制限に達すると、必要な領域が割り当てられていないかぎり、Oracleはファイルの移入を停止します。

外部表キャッシュは自動的にはリフレッシュされません。オブジェクト・ストア上のファイルが変更されたときにキャッシュを更新するには、ファイルを再移入する必要があります。

オブジェクト・ストアからファイルを削除すると、対応するキャッシュ・データは即時に無効になり、取得できません。

外部表キャッシュへの表の追加

DBMS_EXT_TABLE_CACHE.ADD_TABLEを使用して、表全体または特定の割合の外部表をキャッシュに移入します。

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES',
    table_name    => 'STORE_SALES');
END;
/

この例では、すでに移入されている既存のファイルをスキップして、STORE_SALES表をキャッシュに移入しようとします。

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_TABLE (
    owner         => 'SALES',
    table_name    => 'STORE_SALES',
    percent_files => 80);
END;
/

この例では、すでに移入されている既存のファイルをスキップして、STORE_SALES表の80%をキャッシュに移入しようとします。

percent_filesパラメータはオプションです。このパラメータを指定しない場合、表全体がキャッシュに移入されます。

詳細は、ADD_TABLEプロシージャを参照してください。

外部表キャッシュへのファイルの追加

次のプロシージャを使用して、1つ以上のファイルを外部表キャッシュに追加できます。

DBMS_EXT_TABLE_CACHE.ADD_FILEプロシージャを使用して、単一のファイルを外部表キャッシュに移入します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_FILE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

この例では、salesdata.parquetファイルのデータをキャッシュに移入します。

この例では、指定されたファイルがキャッシュに存在し、ファイルが最後にキャッシュされてから変更されていない場合、そのファイルのキャッシュへの移入をスキップします。

詳細は、ADD_FILEプロシージャを参照してください。

DBMS_EXT_TABLE_CACHE.ADD_BY_LIKEプロシージャを使用して、1つ以上のファイルを外部表キャッシュに移入します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

この例では、salesdata.parquetおよびsalesdata1.parquetファイルのデータをキャッシュに移入し、すでに移入されている既存のファイルをスキップします。

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_BY_LIKE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data2.parquet"]',
    esc_char     => '#',
    force        => TRUE);
END;
/

この例では、sales_data1.parquetおよびsales_data2.parquetファイルをキャッシュに移入します。

この例では、'#'文字がエスケープ文字として定義されています。'#'に続く'_'文字は、単一文字に一致するワイルドカードとしてではなく、リテラル・アンダースコアとして扱われます。

詳細は、ADD_BY_LIKEプロシージャを参照してください。

DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILESプロシージャを使用して、最終変更日に基づいて1つ以上のファイルを外部表キャッシュに移入します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.ADD_LATEST_FILES (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    since        => INTERVAL '7' DAY,
    max_files    => 5,
    force        => TRUE);
END;
/

sinceパラメータは、時間間隔を指定します。過去7日以内に変更されたファイルのみがキャッシュに移入されます。

max_filesパラメータは、キャッシュに移入できるファイルの数を制限します。この例では、5つのファイルのみを移入します。

forceパラメータでは、ファイルが変更されていない場合でも、指定したファイルがキャッシュで上書きされます。

詳細は、ADD_LATEST_FILESプロシージャを参照してください。

次のデータ・ディクショナリ・ビューを問い合せて、外部表キャッシュにキャッシュされたファイルをリストします。

外部表キャッシュからのファイルの削除

外部表キャッシュからファイルを削除する例を示しています。

キャッシュからすべてのファイルを削除することも、フィルタ条件を指定してキャッシュから1つ以上のファイルを削除することもできます。たとえば、ファイルを名前でフィルタしたり、特定の時間間隔に基づいてフィルタできます。

外部表キャッシュのクリア

DBMS_EXT_TABLE_CACHE.CLEARを使用して、外部表キャッシュからすべてのファイルを削除します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.CLEAR (
    owner         => 'SALES',
    table_name    => 'STORE_SALES');
END;
/

この例では、STORE_SALESキャッシュからすべてのファイルを削除し、削除されたファイルで使用されているすべての領域の割当てを解除します。

詳細は、CLEARプロシージャを参照してください。

外部表キャッシュからのファイルの削除

次のプロシージャを使用して、外部表キャッシュから1つ以上のファイルを削除できます。

DBMS_EXT_TABLE_CACHE.DROP_FILEを使用して、外部表キャッシュからファイルを削除します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_FILE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    file_url     => 'https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet'
);
END;
/

この例では、キャッシュからsalesdata.parquetファイルを削除し、削除されたファイルで使用されているすべての領域の割当てを解除します。

詳細は、DROP_FILEプロシージャを参照してください。

DBMS_EXT_TABLE_CACHE.DROP_BY_LIKEを使用して、path_filtersパラメータに基づいて1つ以上のファイルを削除します。たとえば:

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/salesdata1.parquet"]'
);
END;
/

この例では、キャッシュからsalesdata.parquetおよびsalesdata1.parquetファイルを削除し、削除されたファイルで使用されているすべての領域の割当てを解除します。

BEGIN
  DBMS_EXT_TABLE_CACHE.DROP_BY_LIKE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    path_filters => '["https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet",
                      "https://swiftobjectstorage.us-ashburn-1.oraclecloud.com/v1/your_namespace/your_bucket/sales#_data1.parquet"]'
);
END;
/

この例では、キャッシュからsales#_data1およびsales#_data2ファイルを削除し、削除されたファイルで使用されているすべての領域の割当てを解除します。

この例では、'#'文字がエスケープ文字として定義されています。'#'に続く'_'文字は、単一文字に一致するワイルドカードとしてではなく、リテラル・アンダースコアとして扱われます。

詳細は、DROP_BY_LIKEプロシージャを参照してください。

DBMS_EXT_TABLE_CACHE.RETIRE_FILESを使用して、指定した間隔に基づいて1つ以上のファイルを削除します。たとえば:

BEGIN
 DBMS_EXT_TABLE_CACHE.RETIRE_FILES (
    owner        => 'SALES',
    table_name   => 'STORE_SALES',
    before       => INTERVAL '30' DAY);
END;
/

この例では、キャッシュから30日より古いファイルを削除し、削除されたファイルで使用されているすべての領域の割当てを解除します。

詳細は、RETIRE_FILESプロシージャを参照してください。

前述の例では、キャッシュを保持しながら1つ以上のファイルをキャッシュから削除します。必要に応じて、ファイルをキャッシュに再度ロードできます。詳細は、「外部表キャッシュへのファイルの移入」を参照してください。

外部表キャッシュの無効化および有効化

外部表キャッシュを無効化および有効化する例を示しています。

DBMS_EXT_TABLE_CACHE.DISABLEを実行して、データベースから外部表キャッシュを無効にします。キャッシュを無効にしても、キャッシュからデータは削除されません。かわりに、キャッシュにDISABLEDのフラグが付けられ、オプティマイザはクエリー・リライトにキャッシュを使用できません。

BEGIN
    DBMS_EXT_TABLE_CACHE.DISABLE (
      owner          => 'SALES',
      table_name     => 'STORE_SALES');
END;
/

この例では、STORE_SALESキャッシュを無効にします。

詳細は、DISABLEプロシージャを参照してください。

外部表キャッシュを無効にした後、DBMS_EXT_TABLE_CACHE.ENABLEを使用してキャッシュを有効にします。

BEGIN
  DBMS_EXT_TABLE_CACHE.ENABLE (
    owner        => 'SALES',
    table_name   => 'STORE_SALES'
 );
END;
/

この例では、STORE_SALESキャッシュを有効にします。

詳細は、ENABLEプロシージャを参照してください。

外部表キャッシュの削除

外部表キャッシュを削除する例を示しています。

DBMS_EXT_TABLE_CACHE.DROP_CACHEを実行して、外部表キャッシュを削除します。DBMS_EXT_TABLE_CACHE.DROP_CACHEプロシージャは、指定された外部表キャッシュをデータベースから削除し、キャッシュに関連付けられた記憶域を解放します。

BEGIN
    DBMS_EXT_TABLE_CACHE.DROP_CACHE (
      owner          => 'SALES',
      table_name     => 'STORE_SALES');
END;
/

この例では、SALESスキーマからSTORE_SALESキャッシュを削除します。

キャッシュを削除すると、そのメタデータがデータ・ディクショナリから削除され、キャッシュされたすべてのデータが削除されます。

詳細は、DROP_CACHEプロシージャを参照してください。

USER_EXTERNAL_TAB_CACHESビューを問い合せて、キャッシュが削除されたことを確認します。たとえば:

SELECT external_table_name, cached
  FROM user_external_tab_caches;

詳細は、「DBA_EXTERNAL_TAB_CACHESビューおよびUSER_EXTERNAL_TAB_CACHESビュー」を参照してください。

外部表キャッシュ情報の表示

Autonomous AI Databaseには、外部表キャッシュを監視できるビューが用意されています。

表示 説明
DBA_EXTERNAL_TAB_CACHESおよびUSER_EXTERNAL_TAB_CACHESビュー データベース内のすべての外部表キャッシュまたはユーザーの外部表キャッシュに関する情報を提供します。
外部_TAB_CACHE_LOCATIONS 現在のユーザーがアクセスでき、キャッシュされた外部表に属しているクラウド・ストレージ内のファイルに関する情報を提供します。
ユーザー_外部_タブ_キャッシュ_ロケーション 現在のユーザーが所有し、キャッシュされた外部表に属しているクラウド・ストレージ内のファイルに関する情報を提供します。このビューは、OWNER列を表示しません。

外部表キャッシュのオプション・サイズ設定プリファレンスの設定

DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTYプロシージャを使用して、外部表キャッシュのサイズ設定および領域割当て制限を設定できます。

デフォルトでは、外部表キャッシュはユーザーに対して無効になっています。外部表キャッシュを有効化および作成するには、DBMS_EXT_TABLE_CACHE.CREATE_CACHEプロシージャを使用します。キャッシュはデフォルト・スキーマに作成され、スキーマに定義された領域割当て制限を継承します。ただし、DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTYプロシージャを使用して、外部表キャッシュの領域割当てを定義することもできます。領域割当て制限を設定するには、DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTYプロシージャのPROPERTY_NAMEおよびPROPERTY_VALUEパラメータを使用します。

PROPERTY_NAMEパラメータは、MAX_CACHE_SIZEおよびMAX_CACHE_PERCENT値を受け入れます。MAX_CACHE_SIZEプロパティは、合計外部キャッシュ・サイズをバイト単位で指定します。MAX_CACHE_PERCENTプロパティは、指定されたユーザーの割当て制限に対する合計外部キャッシュ・サイズをパーセンテージで指定します。

キャッシュ・サイズ・プロパティを設定する前に、次の優先順位に注意してください。

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    property_name  => 'MAX_CACHE_PERCENT',
    property_value => 50,
    owner          => 'SALES');
END;
/

この例では、SALESスキーマのキャッシュ・プリファレンスをMAX_CACHE_PERCENTに設定します。

property_valueは50%で、SALESスキーマのキャッシュ領域割当て制限が、SALESに定義された合計領域割当て制限の最大50%であることを指定します。

BEGIN
    DBMS_EXT_TABLE_CACHE.SET_USER_PROPERTY (
    owner          => 'SALES',
    property_name  => 'MAX_CACHE_SIZE',
    property_value => 5368709120);
END;
/

この例では、SALESスキーマのキャッシュ・プリファレンスをMAX_CACHE_SIZEに設定します。

property_value5368709120で、SALESスキーマの最大キャッシュ・サイズが最大5GBであることを指定します。

詳細は、SET_USER_PROPERTYプロシージャおよびCREATE_CACHEプロシージャを参照してください。

DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTYを使用して、キャッシュ・サイズのプロパティを取得します。

SET SERVEROUTPUT ON
    DECLARE
    max_cache_sz NUMBER,
    BEGIN
    max_cache_sz := DBMS_EXT_TABLE_CACHE.GET_USER_PROPERTY (
        property_name       => 'MAX_CACHE_SIZE',
        owner               => 'SALES');
END;
/

詳細は、GET_USER_PROPERTYファンクションを参照してください。

外部表メタデータ列

外部表メタデータは、問合せの実行時にデータの発生元を特定するのに役立ちます。

DBMS_CLOUD.CREATE_EXTERNAL_TABLEDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEまたはDBMS_CLOUD.CREATE_HYBRID_PART_TABLEを使用して作成する外部表には、2つの非表示列file$pathおよびfile$nameが含まれます。これらの列は、レコードの取得元ファイルの識別に役立ちます。

SELECT genre_id, name, file\$name, file\$path FROM ext_genre
     WHERE rownum <= 2;
genre_id      name        file\$name     file\$path
--------      ---------   -----------   ----------------------
1             Action      genre.csv     https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_gold/o/genre
2             Adventure   genre.csv     https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/moviestream_gold/o/genre

非表示列の詳細は、「非表示列」を参照してください。

関連トピック

DBMS_EXT_CACHEパッケージ