※ 本記事は、Sean Staceyによる”How to run similarity search on Apache Iceberg“を翻訳したものです。

2026年4月23日


Apache Icebergテーブルに保存されたデータに対してセマンティック検索を実行したいが、そのデータを複製したり再フォーマットしたくないとお考えですか? そのニーズにお応えします。

Oracle AI Database 26aiとAI Vector Searchを使用すれば、外部に保存されたベクトル埋め込みに対して、事前にそれらの埋め込みや元となるテキスト・チャンクをデータベースにロードすることなく、類似検索を実行できます。これにより、データの重複を削減し、価値創出までの時間を短縮し、既存のガバナンス管理のもとにデータを保持することができます。

Oracle Database 23.7以降では、密なベクトル埋め込みや疎なベクトル埋め込みを含むファイルに対して外部テーブルを作成することがサポートされています。これにより、SQLなどの使い慣れたインタフェースを使用して、ベクトルが存在する場所で直接クエリを実行できます。これらの外部テーブルは、CSV、Parquet、Avro、ORCなどの一般的なファイル形式を対象に設定できます (詳細は「外部テーブルにおけるベクトル」を参照してください)。

そしてOracle AI Database 26ai (23.26.1)では、ベクトル埋め込みをサポートする外部テーブルがApache Icebergテーブルにも対応しました。これにより、任意の埋め込みモデルで生成したベクトル埋め込みをクラウドのオブジェクト・ストレージ (例えばOCI Object StorageやAWS S3)上のIcebergテーブルに保存し、追加の「すべてを事前にロードする」ステップなしに、Oracle AI Databaseからセマンティック検索を実行することができます。

手順はシンプルです。まず、以下に示すようにIcebergテーブルに対する外部テーブルを作成します。

define oci_path= 'https://objectstorage.<region>.oraclecloud.com/n'
define oci_tenant= '<tenant-name>'
define oci_bucket= '/b/<bucket-name>/o'
define iceberg_table= '&oci_bucket/iceberg/<db-name>/<iceberg-table_name>'
define iceberg_path= '&oci_path/&oci_tenant/&iceberg_table'

CREATE TABLE IF NOT EXISTS ext_vect_table
   (
      id             VARCHAR(10) PRIMARY KEY RELY DISABLE,
      information    VARCHAR2(100),
      embedding      VECTOR(384, float32)
   )
  ORGANIZATION EXTERNAL
   (
      TYPE ORACLE_BIGDATA
      DEFAULT DIRECTORY DATA_PUMP_DIR
      ACCESS PARAMETERS
      (
        com.oracle.bigdata.credential.name=OCI_CRED
        com.oracle.bigdata.fileformat=parquet
        com.oracle.bigdata.access_protocol=iceberg
      )
       LOCATION ('iceberg:&iceberg_path/metadata/v1.metadata.json')
   )
  REJECT LIMIT UNLIMITED;</iceberg-table_name></db-name></bucket-name></tenant-name></region>

図1: Icebergテーブル上に外部テーブルを作成

外部テーブルを作成すると、Icebergテーブル内のデータに対してベクトル類似検索クエリを実行でき、クエリテキストの埋め込みもその場で生成できます (データベース内のONNXランタイムを活用)。これにより、OracleとIcebergのデータをリアルタイムで横断的に検索することが可能になります。さらに、埋め込みモデルをローカルで実行できるため、このアプローチはリモートのモデル・エンドポイントを呼び出すことが望ましくない、あるいは不可能なエアギャップ環境にも適用できます。

SELECT id,
       information,
       vector_distance(embedding, 
                       vector_embedding(my_model using :INPUT_TERM as data) DIST
FROM   ext_vect_table
ORDER  BY DIST
FETCH FIRST 5 ROWS ONLY;

図2: 外部テーブルをクエリして、:INPUT_TERMに最も類似する上位5件を表示

さらに特筆すべき点として、大規模なApache Icebergデータセットに対しては、(以下に示すように)Oracleのベクトル索引を作成することで、Iceberg上に存在するベクトルに対する近似最近傍 (ANN)検索を高速化できます。これらを利用するために、IcebergのデータをOracle AI Databaseにコピーする必要はありません。ベクトル索引はデータベース内に独立して保存されます。これらの索引はIcebergデータセットに応じてスケールし、トランザクション更新や一貫性のあるクエリといった機能をサポートします。オブジェクト・ストレージへのアクセスが一時的に不安定になった場合でも、索引構造は利用可能である可能性があり、接続が回復するまでの間、アプリケーションの影響を最小限に抑えながら動作を継続できます。

CREATE VECTOR INDEX ext_vect_idx_ivf ON ext_vec_table (embedding)
ORGANIZATION NEIGHBOR PARTITIONS;

図3: EXT_VECT_TABLE上に近傍パーティション (IVF_Flat)ベクトル・インデックスを作成

これらの機能を組み合わせることで、以下が可能になります:

  • データが存在する場所で、OracleのSQLおよびAI Vector Search機能を使用してIceberg内のベクトルをクエリ
  • IcebergのデータをOracleにコピーすることなく、Oracleのベクトル索引により大規模環境でも高速なANN検索を実現し、性能を向上

DBAの方にとっては、新たに管理すべきパイプラインを削減できます。エグゼクティブ・スポンサーにとっては、データを既存のプラットフォームやストレージに保持したまま、セマンティック検索やRAG型の導入・活用を迅速化できます。

始めてみる

Oracle LiveLab「Getting Started with Oracle AI Vector Search」を通じて、Oracle AI Databaseでベクトルを活用した類似検索の方法をご確認ください。