ベクトル データ型

適用対象: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

ベクトルデータ型は、類似性探索や機械学習アプリケーションなどの操作に最適化されたベクトルデータを格納します。 ベクトルは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。 ベクトルの各要素は、単精度 (4 バイト) 浮動小数点値として格納されます。

開発者にとって使い慣れたエクスペリエンスを提供するために、 ベクター データ型が作成され、JSON 配列として表示されます。 たとえば、3 次元のベクトルは、 '[0.1, 2, 30]'として表すことができます。 ベクター型とvarchar、nvarchar、json型の間で暗黙的・明示的に変換できます。

ベクター データの操作の詳細については、次を参照してください。

構文例

vector 型の使用法の構文は、テーブル内の他のすべての SQL Server データ型に似ています。

column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]

デフォルトでは、基本型は float32です。 半精度を使うには、float16を明示的に指定します。

column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]

Dimensions

ベクトルには少なくとも 1 つの次元が必要です。 最大次元数はベクトル基底の種類に依存します:

  • float32 は最大1,998次元に対応しています。
  • float16 は最大3,996次元に対応しています。

使用可能な機能

ベクターデータタイプはすべてのデータベース互換性レベルで利用可能です。 ベースタイプを指定していない場合、ベクターは float32を使用します。

ベクター機能は、 Always-up-to-date ポリシーを使用して構成された Azure SQL Managed Instance で使用できます。

半精度浮動小数点(float16)ベクトル

  • 半精度(float16)ベクトルは一般的にAzure SQL Database、Azure SQL Managed Instance、Microsoft FabricのSQLデータベースで利用可能です。 プレビュー設定は不要です。

  • SQL Server 2025(17.x)では、半精度(float16)ベクトルがプレビューで利用可能です。 SQL Server 2025でfloat16を使用するには、PREVIEW_FEATURESデータベーススコープ設定オプションを有効にする必要があります。 詳細については、「SQL Server 2025のプレビュー機能を有効にする」をご覧ください。

半精度ベクトルの詳細については、 ベクトルデータ型の「半精度浮動点子のサポート」を参照してください。

SQL Server 2025でプレビュー機能を有効にする

SQL Server 2025の一部のプレビュー機能では、PREVIEW_FEATURESデータベーススコープ設定オプションを有効にする必要があります。

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

詳細については、 PREVIEW_FEATURESをご覧ください。

Examples

A. 列定義

CREATE TABLE文内の列定義でベクトル型を使いましょう。 例えば次が挙げられます。

次の例では、ベクトル列を含むテーブルを作成し、それにデータを挿入します。

テーブル内の ベクトル 列を定義するには、デフォルトのベース型 float32 または float16 のいずれかを半精度で保存します。

CREATE TABLE dbo.vectors
(
    id INT PRIMARY KEY,
    v VECTOR(3) NOT NULL -- Uses default base type (**float32**)
);

CREATE TABLE dbo.vectors_fp16
(
    id INT PRIMARY KEY,
    v VECTOR(3, float16) -- Uses float16 for reduced storage and precision
);

INSERT INTO dbo.vectors (id, v)
VALUES (1, '[0.1, 2, 30]'),
       (2, '[-100.2, 0.123, 9.876]'),
       (3, JSON_ARRAY(1.0, 2.0, 3.0)); -- Using JSON_ARRAY to create a vector

SELECT *
FROM dbo.vectors;

B. 変数での使用

以下の例では、新しい ベクトル データ型を用いてベクトルを宣言し、 VECTOR_DISTANCE 関数を使って距離を計算します。

変数を持つ ベクトル 型を用いてください:

DECLARE @v AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
GO
DECLARE @v AS VECTOR(3, float16) = '[0.1, 2, 30]';
SELECT @v;

C. ストアド プロシージャまたは関数での使用

ベ クター データ型はストアドプロシージャや関数のパラメータとして使用できます。 例えば次が挙げられます。

CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
    SELECT @V;
    SET @V2 = @V;
END

Conversions

  • ベクター型と sql_variant 型を組み合わせたり、sql_variant変数や列に割り当てたりすることはできません。 この制限は、 varchar(max)、 varbinary(max)、 nvarchar(max)、 xml、 json、CLR ベースのデータ型に似ています。

Compatibility

TDS プロトコルの機能強化

SQL Server では、ベクターは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。

サポートされている ドライバーは、TDS プロトコルの機能強化を使用して、ベクター データをより効率的にバイナリ形式で送信し、ネイティブ ベクター型としてアプリケーションに提示します。 この方法では、ペイロード サイズが削減され、JSON 解析のオーバーヘッドが排除され、完全な浮動小数点精度が維持されます。 その結果、AI と機械学習のシナリオで高次元ベクトルを操作するときのパフォーマンスと精度の両方が向上します。

ネイティブ ドライバーのサポート

TDS バージョン 7.4 以降および更新されたドライバーを使用するアプリケーションでは、ベクター データの読み取り、書き込み、ストリーム、一括コピーをネイティブに行うことができます。

これらの機能には、次のドライバーのバージョンが必要です。 ネイティブ ベクターのサポートを有効にするには、正しいバージョンを使用していることを確認します。

  • Microsoft.Data.SqlClient: バージョン 6.1.0 では、 SqlVector 型が導入され、 System.Data.SqlDbTypesが拡張されています。
  • Microsoft JDBC Driver for SQL Server: バージョン 13.1.0 Preview では、 microsoft.sql.Types.VECTOR の種類と microsoft.sql.Vector クラスが導入されています。

Note

float16ベクトル用のネイティブバイナリトランスポートは、Microsoft JDBC Driver 13.4 for SQL ServerおよびMicrosoft ODBC Driver 18.7.1 for SQL Serverでサポートされています。 これらのドライバーは、ネイティブのワイヤー形式で半精度ベクトル値をシリアライズおよびデシリアライズし、JSON表現に比べてネットワークのペイロードを削減します。 ネイティブの float16 トランスポートにはこれらのドライバーバージョンまたはそれ以降の使用をしてください。 ネイティブの float16 トランスポートをサポートしないドライバーは、 varchar(max) JSON配列で表現されたベクターで引き続き動作できます。

Note

更新された TDS プロトコルをサポートしていないクライアントの場合、SQL Server は、下位互換性を確保するためにベクター データを varchar(max) 型として公開し続けます。 クライアント アプリケーションは、JSON 配列であるかのようにベクター データを操作できます。 SQL Database エンジンは、JSON 配列との間でベクターを自動的に変換し、新しい型をクライアントに対して透過的にします。 そのため、ドライバーとすべての言語は、新しい型と自動的に互換性があります。

すぐに新しい ベクター 型の使用を開始できます。 次の例は、さまざまな言語とドライバーの構成を示しています。

Important

ネイティブ ベクターをサポートするには 、Microsoft.Data.SqlClient 6.1.0 以降が必要です。

using Microsoft.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlTypes;

namespace VectorSampleApp
{
    class Program
    {
        // Set your environment variable or fallback to local server
        private static readonly string connectionString =
            Environment.GetEnvironmentVariable("CONNECTION_STR")
            ?? "Server=tcp:localhost,1433;Database=Demo2;Integrated Security=True;TrustServerCertificate=True";

        private const int VectorDimensions = 3;
        private const string TableName = "dbo.Vectors";

        static void Main()
        {
            using var connection = new SqlConnection(connectionString);
            connection.Open();
            SetupTables(connection, TableName, VectorDimensions);
            InsertVectorData(connection, TableName);
            ReadVectorData(connection, TableName);
        }

        private static void SetupTables(SqlConnection connection, string tableName, int vectorDimensionCount)
        {
            using var command = connection.CreateCommand();

            command.CommandText = $@"
                IF OBJECT_ID('{tableName}', 'U') IS NOT NULL DROP TABLE {tableName};
                IF OBJECT_ID('{tableName}Copy', 'U') IS NOT NULL DROP TABLE {tableName}Copy;";
            command.ExecuteNonQuery();

            command.CommandText = $@"
                CREATE TABLE {tableName} (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );

                CREATE TABLE {tableName}Copy (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );";
            command.ExecuteNonQuery();
        }

        private static void InsertVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"INSERT INTO {tableName} (VectorData) VALUES (@VectorData)", connection);
            var param = command.Parameters.Add("@VectorData", SqlDbTypeExtensions.Vector);

            // Insert null using DBNull.Value
            param.Value = DBNull.Value;
            command.ExecuteNonQuery();

            // Insert non-null vector
            param.Value = new SqlVector<float>(new float[] { 3.14159f, 1.61803f, 1.41421f });
            command.ExecuteNonQuery();

            // Insert typed null vector
            param.Value = SqlVector<float>.CreateNull(VectorDimensions);
            command.ExecuteNonQuery();

            // Prepare once and reuse for loop
            command.Prepare();
            for (int i = 0; i < 10; i++)
            {
                param.Value = new SqlVector<float>(new float[]
                {
                    i + 0.1f,
                    i + 0.2f,
                    i + 0.3f
                });
                command.ExecuteNonQuery();
            }
        }

        private static void ReadVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"SELECT VectorData FROM {tableName}", connection);
            using var reader = command.ExecuteReader();

            while (reader.Read())
            {
                var sqlVector = reader.GetSqlVector<float>(0);

                Console.WriteLine($"Type: {sqlVector.GetType()}, IsNull: {sqlVector.IsNull}, Length: {sqlVector.Length}");

                if (!sqlVector.IsNull)
                {
                    float[] values = sqlVector.Memory.ToArray();
                    Console.WriteLine("VectorData: " + string.Join(", ", values));
                }
                else
                {
                    Console.WriteLine("VectorData: NULL");
                }
            }
        }
    }
}

Note

最新の.NETドライバーを使っていなくても、JsonSerializerクラスを使ってJson文字列としてシリアライズ・デシリアライズすることで、C#でベクターデータを扱うことは可能です。 このアプローチにより、SQL Server が古いクライアント向けに公開しているベクトルの varchar(max) 表現との互換性を確保できます。

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));
    }
}

Tools

次のツールは 、ベクター データ型をサポートしています。

Limitations

ベクター型には、次の制限があります。

Tables

  • 列レベルの制約はサポートされていませんが、 NULL 制約と NOT NULL 制約のみです。

    • DEFAULT および CHECK 制約は、 ベクター 列ではサポートされていません。

    • PRIMARY KEYやFOREIGN KEYなどのキー制約は、ベクター列ではサポートされていません。 等値、一意性、ベクター列をキーとして使用する結合、並べ替え順序は ベクター データ型には適用されません。

    • ベクターの一意性の概念がないため、一意の制約は適用されません。

    • ベクトル内の値の範囲を確認することは適用できません。

  • ベクトルは、比較、加算、減算、乗算、除算、連結、またはその他の数学、論理、複合代入演算子をサポートしていません。

  • メモリ最適化されたテーブルでは ベクター 列は使えません。

Indexes

テーブル スキーマのメタデータ

  • sp_describe_first_result_setシステムのストアドプロシージャはベクターデータ型を正しく返しません。 その結果、多くのデータアクセスクライアントやドライバーは varchar や nvarchar のデータ型を認識します。

台帳テーブル

  • ストレージプロシージャ sp_verify_database_ledger 、データベースに ベクター 列のテーブルが含まれている場合エラーを生成します。

ユーザー定義型

  • ベクタータイプにCREATE TYPEを使ってエイリアスタイプを作成することはできません。 この制限は 、xml や json のデータ型の挙動に似ています。

常に暗号化されています

  • ベ クター タイプはAlways Encrypted機能ではサポートされていません。

既知の問題

  • データ マスクは現在、Azure portal で ベクター データを varbinary データ型として表示しています。