ベクトル索引の使用に関するガイドライン

Hierarchical Navigable Small World (HNSW)またはInverted File Flat (IVF)ベクトル索引を作成および使用するには、次のガイドラインを使用します。

索引の作成のガイドライン

ベクトル索引の作成に必要な最小限の情報は、1つのVECTORデータ型の表列とベクトル索引タイプ(HNSWの場合はINMEMORY NEIGHBOR GRAPH、IVFの場合はNEIGHBOR PARTITIONS)の指定です。ただし、次のような詳細情報も指定できます。

  • オプションで、使用する距離メトリックを含む詳細情報を指定できます。サポートされているメトリックは、EUCLIDEAN SQUAREDEUCLIDEANCOSINEDOTMANHATTANおよびHAMMINGです。指定しない場合、デフォルトでCOSINEが使用されます。
  • 索引作成および近似検索の精度に影響を与える特定のパラメータ。ターゲット精度パーセンテージ値、NEIGHBORS (またはM)、およびHNSWの場合はEFCONSTRUCTION、IVFの場合はNEIGHBOR PARTITIONSです。
  • グローバルにパーティション化されたベクトル索引を作成できます。
  • 索引作成に使用する並列度を指定することもできます。

現在ベクトル索引は次のものに対して定義できません:

  • 外部表
  • IOT
  • クラスタ/クラスタ表
  • グローバル一時表
  • ブロックチェーン表
  • 不変表
  • マテリアライズド・ビュー
  • 関数ベースのベクトル索引

ベクトル索引に関する情報は、ALL_INDEXESDBA_INDEXESおよびUSER_INDEXESビューのファミリを参照することで確認できます。対象となる列は、INDEX_TYPE (VECTOR)およびINDEX_SUBTYPE (INMEMORY_NEIGHBOR_GRAPH_HNSWまたはNEIGHBOR_PARTITIONS_IVF)です。索引がベクトル索引でない場合、INDEX_SUBTYPENULLです。

ベクトル索引の詳細は、「VECSYS.VECTOR$INDEX」を参照してください。

ノート:

  • VECTOR列は、任意の数の次元のベクトルおよび任意の形式のベクトルの次元をサポートするように非常に柔軟に設計されています。ただし、ベクトル索引は、すべて同じ数の次元を持つベクトルを含むVECTOR列にのみ作成できます。これは、異なる次元を持つベクトル間の距離を計算できないので必要となります。たとえば、VECTOR列がVECTOR(*, FLOAT32)として定義され、次元が異なる(それぞれ128および256) 2つのベクトルがその列に挿入されます。その列にベクトル索引を作成しようとすると、エラーが発生します。
  • 空の表のベクトル列にIVF索引が作成され、特定の次元を持つnull以外のベクトルが挿入されると、IVF索引が存在するため、異なる次元を持つ新しいベクトルを同じベクトル列に挿入できません。
  • 表が切り捨てられると、表に作成されたIVF索引はUNUSABLEとしてマークされます。このため、IVF索引は、同じ次元数または異なる次元数のベクトルを含む後続のINSERT文では維持されません。問合せで索引を再び使用する前に、IVF索引を再作成する必要があります。
  • ベクトル列ごとに1つのタイプのベクトル索引のみを作成できます。
  • Oracleでは、大きいベクトル空間およびベクトル・サイズを使用して適切なIVFベクトル索引を作成する場合は、大きい一時表領域を割り当てることをお薦めします。このような場合、システムで内部的に広い一時領域が使用されます。
  • RAC環境では、ベクトル索引のパフォーマンスを最大にするために、各インスタンスにベクトル・プールを設定できます。

索引使用のガイドライン

Oracle Database Optimizerでベクトル索引が考慮されるようにするには、SQL文が次の状態になるようにします:

  • 類似検索SQL問合せには、APPROXまたはAPPROXIMATEキーワードが含まれている必要があります。
  • ベクトル索引が存在する必要があります。
  • 索引の距離関数は、vector_distance()関数で使用される距離関数と同じである必要があります。
  • ベクトル索引DDLで距離関数が指定されておらず、vector_distance()関数でEUCLIDEANDOTMANHATTANまたはHAMMINGが使用されている場合、ベクトル索引は使用されません。
  • ベクトル索引DDLでDOT距離関数が使用され、vector_distance()関数でデフォルトの距離関数COSINEが使用されている場合、ベクトル索引は使用されません。
  • vector_distance()を別のSQL関数の中に含めないでください。
  • パーティションの行制限句を使用する場合、ベクトル索引は使用されません。
  • IVF索引を使用した索引の精度は、基礎となる表に対してDML操作が実行されるため、時間の経過とともに低下する可能性があります。これを確認するには、DBMS_VECTORパッケージによって提供されるINDEX_ACCURACY_QUERYファンクションを使用します。このような場合、DBMS_VECTORパッケージで提供されるREBUILD_INDEXファンクションを使用して索引を再構築できます。DBMS_VECTORとそのサブプログラムの詳細は、「DBMS_VECTOR」を参照してください。

ノート:

グローバル索引の更新の有無にかかわらず、ALTER TABLE tab SUBPARTITION/PARTITION (RANGE/LIST)を除き、グローバル・ベクトル索引は、パーティション表に対する他のパーティション管理操作の一部として使用不可としてマークされます。その場合は、グローバル・ベクトル索引を手動で再作成する必要があります。