Dela via


Datatyp för vektor

Gäller för: SQL Server 2025 (17.x) Förhandsversion av Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Förhandsversion av Microsoft Fabric

Vektordatatypen är utformad för att lagra vektordata som är optimerade för åtgärder som likhetssökning och maskininlärningsprogram. Vektorer lagras i ett optimerat binärt format men exponeras som JSON-matriser för enkelhetens skull. Varje element i vektorn lagras som ett flyttal med enkel precision (4 byte).

För att ge utvecklare en välbekant upplevelse skapas och visas vektordatatypen som en JSON-matris. Till exempel kan en vektor med tre dimensioner representeras som '[0.1, 2, 30]'. Implicit och explicit konvertering från och till vektortypen kan göras med hjälp av varchar-, nvarchar- och json-typer .

Note

SQL Server 2025 (17.x) Preview stöder halvprecisionsvektorer (float16).

För mer information, se här.

float16 vektor är för närvarande tillgänglig för förhandsversion. Om du vill testa aktiverar du konfigurationsalternativet PREVIEW_FEATURES med databasomfattning. Mer information finns i PREVIEW_FEATURES = { ON | AV }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Note

Granska Begränsningar och Kända problem för begränsningar.

Vektorfunktioner är tillgängliga i Azure SQL Managed Instance som konfigurerats med principen Always-up-to-date .

Mer information om hur du arbetar med vektordata finns i:

Exempelsyntax

Användningssyntaxen för vektortypen liknar alla andra SQL Server-datatyper i en tabell.

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

Som standard är bastypen float32. Om du vill använda halvprecision måste du uttryckligen ange float16

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

Dimensions

En vektor måste ha minst en dimension. Det maximala antalet dimensioner som stöds är 1998.

Examples

A. Kolumndefinition

Vektortypen kan användas i kolumndefinitionen i en CREATE TABLE -instruktion, till exempel:

I följande exempel skapas en tabell med en vektorkolumn och data infogas i den. Du kan definiera en VECTOR kolumn i en tabell med standardbastypen (float32) eller uttryckligen ange float16 för lagring med halv precision.

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

CREATE TABLE dbo.vectors (
    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. Användning i variabler

I följande exempel deklareras vektorer med hjälp av den nya vektordatatypen och beräknar avstånd med hjälp av VECTOR_DISTANCE funktionen.

Vektortypen kan användas med variabler:

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

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

C. Användning i lagrade procedurer eller funktioner

Vektordatatypen kan användas som parameter i lagrad procedur eller funktioner. Till exempel:

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

Tillgänglighet av funktioner

Den nya vektortypen är tillgänglig under alla databaskompatibilitetsnivåer.

Stöd för float16 vektorer är för närvarande inhägnat under konfigurationen PREVIEW_FEATURES . Du måste uttryckligen aktivera den innan du använder VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • Vektortypen kan inte användas med den sql_variant typen eller tilldelas till en sql_variant variabel eller kolumn. Den här begränsningen liknar varchar(max), varbinary(max), nvarchar(max), xml, json och CLR-baserade datatyper.

Compatibility

Förbättringar av TDS-protokollet

SQL Server lagrar vektorer i ett optimerat binärt format men exponerar dem som JSON-matriser för enkelhetens skull. Drivrutiner som stöds använder förbättringar av TDS-protokollet för att överföra vektordata mer effektivt i binärt format och presentera dem för program som inbyggda vektortyper. Den här metoden minskar storleken på nyttolasten, eliminerar överheaden vid JSON-parsning och bevarar full flyttalsprecision. Därför förbättras både prestanda och noggrannhet när du arbetar med högdimensionella vektorer i AI- och maskininlärningsscenarier.

Note

float16 vektorer överförs för närvarande som VARCHAR(MAX) (JSON-matris) över TDS. Stöd för binär transport för float16 är ännu inte tillgängligt i drivrutiner som ODBC, JDBC och .NET.

Stöd för intern drivrutin

Program som använder TDS version 7.4 eller senare och uppdaterade drivrutiner kan läsa, skriva, strömma och masskopiera vektordata internt.

Dessa funktioner kräver versioner av de drivrutiner som anges nedan. Se till att du använder rätt version för att aktivera inbyggt vektorstöd.

  • Microsoft.Data.SqlClient: Version 6.1.0 introducerar SqlVector typen och utökar System.Data.SqlDbTypes.
  • Microsoft JDBC-drivrutin för SQL Server: Version 13.1.0 Preview introducerar microsoft.sql.Types.VECTOR typ och microsoft.sql.Vector klass.

Note

För klienter som inte stöder det uppdaterade TDS-protokollet fortsätter SQL Server att exponera vektordata som varchar(max) typer för att säkerställa bakåtkompatibilitet. Klientprogram kan fungera med vektordata som om det vore en JSON-matris. SQL Database Engine konverterar automatiskt vektorer till och från en JSON-matris, vilket gör den nya typen transparent för klienten. Därför är drivrutiner och alla språk automatiskt kompatibla med den nya typen.

Du kan börja använda den nya vektortypen direkt. I följande exempel visas olika språk och drivrutinskonfigurationer.

Important

Kräver Microsoft.Data.SqlClient 6.1.0 eller senare för inbyggt vektorstöd.


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

Om du inte använder de senaste .NET-drivrutinerna kan du fortfarande arbeta med vektordata i C# genom att serialisera och deserialisera dem som en JSON-sträng med hjälp av JsonSerializer klassen. Detta säkerställer kompatibilitet med representationen varchar(max) av vektorer som exponeras av SQL Server för äldre klienter.

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

Följande verktyg stöder vektordatatypen :

Limitations

Vektortypen har följande begränsningar:

Tables

  • Begränsningar på kolumnnivå stöds inte, förutom NULL/NOT NULL begränsningar.
    • DEFAULT och CHECK begränsningar stöds inte för vektorkolumner .
    • Viktiga begränsningar, till exempel PRIMARY KEY eller FOREIGN KEY, stöds inte för vektorkolumner . Likhet, unikhet, kopplingar med vektorkolumner som nycklar och sorteringsordningar gäller inte för vektordatatyper .
    • Det finns ingen uppfattning om unikhet för vektorer, så unika begränsningar är inte tillämpliga.
    • Det är inte heller tillämpligt att kontrollera intervallet med värden i en vektor.
  • Vektorer stöder inte jämförelse, addition, subtraktion, multiplikation, division, sammanfogning eller andra matematiska, logiska och sammansatta tilldelningsoperatorer.
  • vektorkolumner kan inte användas i minnesoptimerade tabeller.

Indexes

  • B-trädindex eller kolumnlagringsindex tillåts inte i vektorkolumner . En vektorkolumn kan dock anges som en inkluderad kolumn i en indexdefinition.

Metadata för tabellschema

  • sp_describe_first_result_set system lagrade proceduren returnerar inte korrekt vektordatatypen . Därför ser många dataåtkomstklienter och drivrutin datatypen varchar eller nvarchar .

Transaktionsregistertabeller

  • Lagrad procedur sp_verify_database_ledger genererar ett fel om databasen innehåller en tabell med en vektorkolumn .

Användardefinierade typer

  • Det går inte att skapa aliastypen som använder CREATE TYPE för vektortypen, ungefär som för xml- och json-datatyperna.

Alltid Krypterad

  • vektortyp stöds inte med always encrypted-funktionen.

Kända problemområden

  • Datamaskering visar för närvarande vektordata som varbinär datatyp i Azure-portalen.