VECTORデータ型を使用する表の作成

表の列は、VECTORデータ型として宣言できます。

次のコマンドは簡単な例です。

CREATE TABLE my_vectors (id NUMBER, embedding VECTOR);

この例では、次元数や形式はどちらもオプションであり、指定する必要はありません。これらのいずれも指定しない場合は、異なる形式の異なる次元のベクトルを入力できます。これは、Oracle Databaseでのベクトルの使用開始が容易になるように簡略化されています。

ノート:

通常、このようなベクトルは、異なる埋込みモデルで生成されます。異なるモデル(異なるセマンティックのランドスケープが提供されます)のベクトルは、類似検索で使用した場合、比較できません。

格納できる内容に制約を加える、より複雑な例を次に示します。

CREATE TABLE my_vectors (id NUMBER, embedding VECTOR(768, INT8)) ;

この例では、次のような各ベクトルが格納されます。

  • 768次元である必要があり、かつ
  • 各次元がINT8としてフォーマットされている
次元数は、必ずゼロより大きく、BINARY以外のベクトルの場合は最大65535、およびBINARYベクトルの場合は最大65528である必要があります。それを超える値を使用しようとすると、次のエラーが発生します。
ORA-51801: Invalid VECTOR type specification: Invalid dimension
count ('...'). Valid values can either be * (i.e. flexible) or an
integer between 1 and 65535.

BINARYベクトルには、8の倍数である次元が必要です。指定した次元が8の倍数でない場合、次のエラーが発生します:

ORA-51813: Vector of BINARY format should have a dimension count 
that is a multiple of 8.

使用可能な次元の形式は次のとおりです。

  • INT8 (8ビットの整数)
  • FLOAT32 (32ビットのIEEE浮動小数点数)
  • FLOAT64 (64ビットのIEEE浮動小数点数)
  • BINARY (パックUINT8のバイト。各次元は1つのビットです)

Oracle Databaseでは、必要に応じて値が自動的にキャストされます。

VECTORを定義して表に挿入する方法を示す単純なコードを次に示します:

DROP TABLE my_vect_tab PURGE;
CREATE TABLE my_vect_tab (v01 VECTOR(3, INT8));
INSERT INTO my_vect_tab VALUES ('[10, 20, 30]');

SELECT * FROM my_vect_tab;

V01
----------
[10,20,30]

テキスト形式を使用して、SQL文でベクトルを表します。前述のINSERT文に示されているDENSEテキスト形式は、基本的な例です。座標1の値は10、座標2の値は20、座標3の値は30です。各座標をカンマで区切って、リストを大カッコで囲みます。

これまでのところ、表示されるベクトル・タイプは、デフォルトでDENSEベクトルであり、これには各次元が物理的に格納されます。表示されるすべての定義は次の形式と同等です:

VECTOR(number_of_dimensions, dimension_element_format, DENSE) or
VECTOR(number_of_dimensions, dimension_element_format, *)

ただし、SPARSEベクトルを作成するオプションもあります。DENSEベクトルとは対照的に、疎ベクトルは、次元値がほとんどゼロであることが予想されるベクトルです。SPARSEベクトルを使用する場合、0以外の値のみが物理的に格納されます。疎ベクトルは、次の形式を使用して定義します:

VECTOR(number_of_dimensions, dimension_element_format, SPARSE)

ノート:

  • 2つの表現のコーディングが非常に異なるため、ある行をSPARSE格納形式にして、同じベクトル列の別の行をDENSE格納形式にすることはサポートされていません。

  • BINARY形式では、疎ベクトルはサポートされていません。

  • VECTOR(..., ..., *)は、常にDENSEとして解釈されます。

  • SPARSEベクトルは、ベクトル索引の作成には使用できません。

次の表に、DENSE格納形式のVECTORデータ型に使用できる宣言形式を示します:

使用可能な宣言形式 説明

VECTOR

ベクトルは任意の数の次元と形式を持つことができます。

VECTOR(*, *)

VECTOR(*, *, *)

VECTOR(*, *, DENSE)

ベクトルは任意の数の次元と形式を持つことができます。

VECTOR

VECTOR(*, *)

VECTOR(*,*,*)および

VECTOR(*, *, DENSE)は同等です。

VECTOR(number_of_dimensions)

VECTOR(number_of_dimensions, *)

VECTOR(number_of_dimensions, *, *)

VECTOR(number_of_dimensions, *, DENSE)

すべてのベクトルが、指定された次元数を持っている必要があります。そうしないと、エラーがスローされます。すべてのベクトルは、形式を変更せずに次元を格納します。

VECTOR(number_of_dimensions)、

VECTOR(number_of_dimensions, *)、

VECTOR(number_of_dimensions, *, *)および

VECTOR(number_of_dimensions, *, DENSE)は同等です。

VECTOR(*, dimension_element_format)

VECTOR(*, dimension_element_format, *)

VECTOR(*, dimension_element_format, DENSE)

ベクトルは任意の数の次元を持つことができますが、その形式は指定されたdimension_element_format (INT8FLOAT32FLOAT64またはBINARY)に上位変換または下位変換されます。

VECTOR(*, dimension_element_format)、

VECTOR(*, dimension_element_format, *)および

VECTOR(*, dimension_element_format, DENSE)は同等です。

次の表に、疎ベクトルのVECTORデータ型に使用できる宣言形式を示します。

使用可能な宣言形式 説明

VECTOR(*, *, SPARSE)

BINARY以外のベクトルには、任意の数の次元および形式を指定できます。

VECTOR(number_of_dimensions, *, SPARSE)

すべてのベクトルが、指定された次元数を持っている必要があります。そうしないと、エラーがスローされます。すべてのベクトルは、形式を変更せずに次元を格納します。

VECTOR(*, dimension_element_format, SPARSE)

ベクトルは任意の数の次元を持つことができますが、その形式は指定されたdimension_element_format (INT8FLOAT32またはFLOAT64)に上位変換または下位変換されます

次のSQL*Plusコードは、様々なベクトル定義がシステムでどのように解釈されるかを示しています。

CREATE TABLE my_vect_tab (
     v1  VECTOR(3, FLOAT32),
     v2  VECTOR(2, FLOAT64),
     v3  VECTOR(1, INT8),
     v4  VECTOR(1024, BINARY),
     v5  VECTOR(1, *),
     v6  VECTOR(*, FLOAT32),
     v7  VECTOR(*, *),
     v8  VECTOR,
     v9  VECTOR(10),
     v10 VECTOR(*, *, DENSE),
     v11 VECTOR(1024, FLOAT32, DENSE),
     v12 VECTOR(1000, INT8, SPARSE),
     v13 VECTOR(*, INT8, SPARSE),
     v14 VECTOR(*, *, SPARSE),
     v15 VECTOR(2048, FLOAT32, *)
   );

Table created.

DESC my_vect_tab;
 Name                        Null?    Type
 --------------------------- -------- ----------------------------
 V1                                   VECTOR(3 , FLOAT32, DENSE)
 V2                                   VECTOR(2 , FLOAT64, DENSE)
 V3                                   VECTOR(1 , INT8, DENSE)
 V4                                   VECTOR(1024, BINARY, DENSE)
 V5                                   VECTOR(1 , *, DENSE)
 V6                                   VECTOR(* , FLOAT32, DENSE)
 V7                                   VECTOR(* , *, DENSE)
 V8                                   VECTOR(* , *, DENSE)
 v9                                   VECTOR(10, *, DENSE)
 v10                                  VECTOR(*, *, DENSE)
 v11                                  VECTOR(1024, FLOAT32, DENSE)
 v12                                  VECTOR(1000, INT8, SPARSE)
 v13                                  VECTOR(*, INT8, SPARSE)
 v14                                  VECTOR(*, *, SPARSE)
 v15                                  VECTOR(2048, FLOAT32, DENSE)

ベクトルはNULLにできますが、その次元はNULLにはできません(たとえば、[1.1, NULL, 2.2]などのNULL次元を持つVECTORを持つことはできません)。

ノート:

ベクトル(DENSEおよびSPARSE)は内部的にSecurefile BLOBとして格納され、最も一般的な埋込みモデルのベクトルのサイズは1.5KBから12KBです。次の式を使用して、ディスク上のベクトルのサイズを判断できます:
  • DENSEベクトルの場合:

    ベクトル数 * 次元数 * ベクトル次元タイプのサイズ(たとえば、FLOAT32BINARY_FLOATと同等で、サイズは4バイトです)。

  • SPARSEベクトルの場合:

    ベクトルの数 * ((疎次元の平均数* 4バイト) + (疎次元の数*ベクトル次元タイプのサイズ))

制限

現在VECTOR列は、次のものに定義できず、次のものとして定義できません。

  • IOT (主キーとしてまたは非キー列として)
  • クラスタ/クラスタ表
  • グローバル一時表
  • (サブ)パーティション化キー
  • 主キー
  • 外部キー
  • 一意制約
  • チェック制約
  • デフォルト値
  • 列の変更
  • 手動セグメント領域管理(MSSM)表領域(SYSユーザーのみがMSSM表領域に基本ファイルとしてベクトルを作成できます)
  • 連続問合せ通知(CQN)問合せ
  • Bツリー、ビットマップ、逆キー、テキスト、空間索引などのベクトル以外の索引

Oracle Databaseは、次のSQL構文をVECTOR列でサポートしていません。

  • Distinct、Count Distinct
  • Order By、Group By
  • Join条件
  • 比較演算子(>、<、=など)など

OracleのGlobally Distributed Databaseには、ベクトル・データ型に関する次の制限があります:

  • シャーディング・キー: 分散データベースでは、非ベクトル列でのみシャーディング・キーがサポートされます。ベクトル・データは、シャーディング・キーとして識別される他の非ベクトル列の主キーを使用してシャード間に分散されます。

  • Raftレプリケーション: 高可用性のためにRaftレプリケーション方法を使用する分散データベースでは、ベクトル列はサポートされていません。

トピック