ベクトル データ型 (プレビュー)
適用対象: Azure SQL Database
vector データ型は、類似性検索や機械学習アプリケーションなどの操作用に最適化されたベクトル データを格納するように設計されています。 ベクトルは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。 ベクトルの各要素は、単精度 (4 バイト) 浮動小数点値として格納されます。
Note
このデータ型はプレビュー段階であり、変更される可能性があります。 Online Services のサービス レベル アグリーメント (SLA) ドキュメントで、プレビューの使用条件をお読みください。 現在のプレビューの制限事項については、「制限事項」および「既知の問題」を参照してください。
SQL Database でのベクトル データ操作の詳細については、以下を参照してください。
構文例
vector 型の使用法の構文は、テーブル内の他のすべての SQL Server データ型に似ています。
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
Dimensions
ベクトルには少なくとも 1 つの次元が必要です。 サポートされている次元の最大数は 1998 です。
例
A. 列の定義
vector 型は、CREATE TABLE
ステートメントに含まれる列定義で使用できます。次に例を示します。
次の例では、ベクトル列を含むテーブルを作成し、それにデータを挿入します。
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL
);
INSERT INTO dbo.vectors (id, v) VALUES
(1, '[0.1, 2, 30]'),
(2, '[-100.2, 0.123, 9.876]');
SELECT * FROM dbo.vectors;
B. 変数での使用
次の例では、新しい vector データ型を使用してベクトルを宣言し、VECTOR_DISTANCE
関数を使用して距離を計算しています。
vector 型は変数と共に使用できます。
DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
C: ストアド プロシージャまたは関数での使用
vector データ型は、ストアド プロシージャまたは関数のパラメーターとして使用できます。 次に例を示します。
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
機能の利用可能性
Azure SQL Database でのベクトルのネイティブ サポートは、現在プレビュー段階です。
新しい vector 型は、すべてのデータベース互換性レベルで使用できます。
互換性
すべてのクライアントがベクトル データを操作できるように、ベクトルは varchar(max) 型として公開されます。 クライアント アプリケーションは、ベクトル データを JSON 配列であるかのように操作できます。 ベクトルはエンジンによって JSON 配列との間で自動的に変換されるため、この新しい型はクライアントに対して透過的です。 このアプローチにより、すべてのドライバーとすべての言語が自動的に新しい型と互換性を持つことになります。
新しいベクトル型の使用をすぐに開始できます。 次に例をいくつか示します。
C# では、JsonSerializer
クラスを使用して、文字列との間でベクトルをシリアル化および逆シリアル化できます。
using Microsoft.Data.SqlClient;
using Dapper;
using DotNetEnv;
using System.Text.Json;
namespace DotNetSqlClient;
class Program
{
static void Main(string[] args)
{
Env.Load();
var v1 = new float[] { 1.0f, 2.0f, 3.0f };
using var conn = new SqlConnection(Env.GetString("MSSQL"));
conn.Execute("INSERT INTO dbo.vectors VALUES(100, @v)", param: new {@v = JsonSerializer.Serialize(v1)});
var r = conn.ExecuteScalar<string>("SELECT v FROM dbo.vectors") ?? "[]";
var v2 = JsonSerializer.Deserialize<float[]>(r);
Console.WriteLine(JsonSerializer.Serialize(v2));
}
}
制限事項
進行中のプレビューには、次の制限があります。
Tables
- 列レベルの制約は、
NULL
/NOT NULL
制約を除き、サポートされていません。DEFAULT
およびCHECK
制約は、vector 列ではサポートされていません。PRIMARY KEY
やFOREIGN KEY
などのキー制約は、vector 列ではサポートされていません。 等値、一意性、ベクトル列をキーとして使用する結合、並べ替え順序は、vector データ型には適用されません。- ベクトルには一意性の概念がないため、一意制約は適用されません。
- ベクトル内の値の範囲確認も適用されません。
- ベクトルは、比較、加算、減算、乗算、除算、連結、またはその他の数学、論理、複合代入演算子をサポートしていません。
- vector 列はメモリ最適化テーブルでは使用できません。
ALTER TABLE ... ALTER COLUMN
を使用して vector 列を他のデータ型に変更することはできません。
テーブル スキーマのメタデータ
システム ストアド プロシージャ sp_describe_first_result_set から vector データ型は正しく返されません。 そのため、多くのデータ アクセス クライアントとドライバーには、varchar または nvarchar データ型が示されます。
INFORMATION_SCHEMA.COLUMNS
は、vector 型を使用している列を varbinary として報告します。 正しいデータ型を取得するための回避策は、システム ビューsys.columns
を使用することです。sys.columns
はベクトルの長さをバイト単位で返します。 次元の数を取得するには、次の式を使用します。dimensions = (length - 8) / 4
ここで、
length
はmax_length
によって返される値です。 たとえば、20 バイトのmax_length
が示された場合、次元の数は (20 - 8) / 4 = 3 になります。
変換
vector 型からの暗黙的および明示的な変換は、
CAST
またはCONVERT
を使用して varchar と nvarchar 型にすることができます。同様に、varchar と nvarchar のみを暗黙的または明示的に vector 型に変換できます。vector 型は、sql_variant 型と共に使用することはできず、sql_variant の変数または列に割り当てることもできません。 この制限は、varchar(max)、varbinary(max)、nvarchar(max)、xml、json、CLR ベースのデータ型に似ています。
JSON データ型との間のキャストはまだサポートされていません。 回避策は、最初に nvarchar(max) との変換を行ってから JSON との変換を行うことです。 たとえば、ベクトルを JSON 型に変換するには、次のようにします。
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]'; SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
JSON 型からベクトルに変換する場合は、次のとおりです。
DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30) SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
インデックス
- B ツリー インデックスまたは列ストア インデックスは、vector 列では使用できません。 ただし、vector 列は、インデックス定義に含まれる列として指定できます。
ユーザー定義データ型
CREATE TYPE
を使用して vector 型のエイリアス型を作成することはできません。これは xml および json データ型の動作と同様です。
台帳テーブル
- データベースに vector 列を使用しているテーブルが含まれている場合は、ストアド プロシージャ
sp_verify_database_ledger
でエラーが発生します。
既知の問題
進行中のプレビューには、次の既知の問題があります。
- 現在、SQL Server Management Studio、Azure Data Studio、VS Code 用 mssql 拡張機能などのツールでは、vector データ型を使用している列を含むテーブルのスクリプトを生成できない場合があります。
- 現在、SQL Server Management Studio、Azure Data Studio、VS Code 用 mssql 拡張機能などのツールでは、vector 型を使用している列について、vector ではなく varbinary のデータ型が報告される場合があります。
- テーブルに vector 型が含まれている場合、BCP と
BULK INSERT
は現在機能しません。 - DacFx を使用したインポートとエクスポートは、現在、vector 型を使用しているテーブルがある場合は機能しません。
- 現在、列暗号化で vector 型はサポートされていません。
- 現在、Always Encrypted で vector 型はサポートされていません。
- データ マスクでは現在、vector データはポータルで varbinary データ型として表示されます。
これらの問題は今後の更新で修正され、それに応じてドキュメントが更新される予定です。