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格納形式にすることはサポートされていません。 -
VECTOR(..., ..., *)は、常にDENSEとして解釈されます。 - Inverted File Flat (IVF)ベクトル索引は、
SPARSEベクトルの上に作成できません。この制限は、Hierarchical Navigable Small World (HNSW)ベクトル索引には適用されません。 -
Oracle Databaseコードのコンパイルに使用されるコンパイラに応じて、値は有効桁数7または8に丸められます。つまり、
FLOAT32およびFLOAT64で許容される最大値を超える値は、数値が最大値に切り捨てられると、エラーなしで挿入できます。ユースケースに使用されるベクトルの次元に必要な精度を考慮する場合は、この点に留意してください。
次の表に、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として指定できます。通常、疎ベクトルは多数の次元を持つがゼロ以外の次元値はほとんどないベクトルですが、密ベクトルはすべての次元に値(ゼロ値を含む)が格納されるベクトルです。
親トピック: ベクトル埋込みの格納