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
データ型に使用できる宣言形式を示します:
使用可能な宣言形式 | 説明 |
---|---|
|
ベクトルは任意の数の次元と形式を持つことができます。 |
|
ベクトルは任意の数の次元と形式を持つことができます。
|
|
すべてのベクトルが、指定された次元数を持っている必要があります。そうしないと、エラーがスローされます。すべてのベクトルは、形式を変更せずに次元を格納します。
|
|
ベクトルは任意の数の次元を持つことができますが、その形式は指定されたdimension_element_format (
|
次の表に、疎ベクトルのVECTOR
データ型に使用できる宣言形式を示します。
使用可能な宣言形式 | 説明 |
---|---|
|
|
|
すべてのベクトルが、指定された次元数を持っている必要があります。そうしないと、エラーがスローされます。すべてのベクトルは、形式を変更せずに次元を格納します。 |
|
ベクトルは任意の数の次元を持つことができますが、その形式は指定された |
次の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
ベクトルの場合:ベクトル数 * 次元数 * ベクトル次元タイプのサイズ(たとえば、
FLOAT32
はBINARY_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レプリケーション方法を使用する分散データベースでは、ベクトル列はサポートされていません。
トピック
- 外部表のベクトル
外部表はVECTOR
型の列を使用して作成できるため、外部ファイルに格納されたテキスト形式またはバイナリ形式で表されるベクトル埋込みを、Oracle DatabaseでVECTOR
データ型としてレンダリングできます。 - 分散データベース表のベクトル
Globally Distributed Databaseにベクトル列を含むシャード表および重複表を作成する場合、新しいSQL構文またはキーワードはありませんが、考慮する必要がある要件および制限がいくつかあります。 - BINARYベクトル
FLOAT32
(ベクトルのカンマ区切り文字列表現のデフォルト形式)、FLOAT64
およびINT8
次元形式に加えて、BINARY
次元形式を使用することもできます。 - SPARSEベクトル
ベクトルの格納形式は、SPARSE
またはDENSE
として指定できます。通常、疎ベクトルは多数の次元を持つがゼロ以外の次元値はほとんどないベクトルですが、密ベクトルはすべての次元に値(ゼロ値を含む)が格納されるベクトルです。
親トピック: ベクトル埋込みの格納