Datatyp för vektor

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

Vektordatatypen lagrar vektordata optimerad för operationer som likhetssökning och maskininlärningsapplikationer. 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]'. Du kan implicit och explicit konvertera mellan vektortypen och varchar-, nvarchar- och json-typerna .

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. För att använda halvprecision, ange float16 explicit.

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

Dimensions

En vektor måste ha minst en dimension. Det maximala antalet dimensioner beror på vektorbastypen:

  • float32 stödjer upp till 1 998 dimensioner.
  • float16 stöder upp till 3 996 dimensioner.

Tillgänglighet av funktioner

Vektordatatypen finns tillgänglig under alla databaskompatibilitetsnivåer. Om du inte specificerar en bastyp använder vektorn float32.

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

Vektorer med halvprecision i float16-format

  • Halvprecisionvektorer (float16) finns generellt tillgängliga i Azure SQL Database, Azure SQL Managed Instance och SQL database i Microsoft Fabric. Ingen förhandsvisningskonfiguration krävs.

  • I SQL Server 2025 (17.x) finns halvprecisionsvektorer (float16) tillgängliga i förhandsvisning. För att använda float16 i SQL Server 2025 måste du aktivera konfigurationsalternativet PREVIEW_FEATURES för databasens scoped. För mer information, se Aktivera förhandsgranskningsfunktioner i SQL Server 2025.

För mer information om halvprecisionsvektorer, se Halvprecisionsflottörstöd i vektordatatypen.

Aktivera förhandsgranskningsfunktioner i SQL Server 2025

För vissa förhandsvisningsfunktioner i SQL Server 2025 måste du aktivera konfigurationsalternativet för PREVIEW_FEATURES databasomfattning.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

För mer information, se PREVIEW_FEATURES.

Examples

A. Kolumndefinition

Använd vektortypen i kolumndefinitioner inom en CREATE TABLE sats. Till exempel:

I följande exempel skapas en tabell med en vektorkolumn och data infogas i den.

Definiera en vektorkolumn i en tabell genom att använda antingen standardbastypen float32 eller float16 för halvprecisionslagring.

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. Användning i variabler

Följande exempel deklarerar vektorer genom att använda den nya vektordatatypen och beräknar avstånd med hjälp av VECTOR_DISTANCE funktionen.

Använd vektortypen med variabler:

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. Användning i lagrade procedurer eller funktioner

Du kan använda vektordatatypen som parameter i lagrade procedurer eller funktioner. Till exempel:

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

Conversions

  • Du kan inte använda vektortypen med sql_variant typen eller tilldela den 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.

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 följande drivrutiner. 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

Inbyggd binär transport för float16-vektorer stöds i Microsoft JDBC Driver 13.4 för SQL Server och Microsoft ODBC Driver 18.7.1 för SQL Server. Dessa drivrutiner serialiserar och deserialiserar halvprecisionsvektorvärden med hjälp av det inbyggda trådformatet, vilket minskar nätverkslasten jämfört med JSON-representationen. Använd dessa drivrutinsversioner eller senare för native float16-transport . Drivrutiner som inte stödjer nativ float16-transport kan fortsätta arbeta med vektorer representerade som varchar(max) JSON-arrayer.

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 den som en JSON-sträng med hjälp av klassenJsonSerializer. Denna metod säkerställer kompatibilitet med varchar(max) representationen av vektorer som SQL Server exponerar 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

  • Kolumnnivåbegränsningar stöds inte, förutom NULL och 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.

    • Att kontrollera värdeintervallet inom en vektor är inte tillämpligt.

  • Vektorer stöder inte jämförelse, addition, subtraktion, multiplikation, division, sammanfogning eller andra matematiska, logiska och sammansatta tilldelningsoperatorer.

  • Du kan inte använda vektorkolumner i minnesoptimerade tabeller.

Indexes

  • Du kan inte använda B-trädindex eller kolumnlagringsindex på vektorkolumner . Du kan dock inkludera en vektorkolumn som inkluderad kolumn i en indexdefinition.
  • Vektorindex skapar ett ungefärligt index på en vektorkolumn för att förbättra prestandan vid närmaste granne-sökning. För att lära dig mer om hur vektorindexering och vektorsökning fungerar, samt skillnaderna mellan exakt och approximativ sökning, se Vektorsökning och vektorindex i SQL Database Engine.

Metadata för tabellschema

  • Den sp_describe_first_result_set systemlagrade proceduren returnerar inte vektordatatypen korrekt. Som ett resultat ser många dataåtkomstklienter och drivrutiner en varchar - eller nvarchar-datatyp .

Transaktionsregistertabeller

  • Den lagrade proceduren sp_verify_database_ledger genererar ett fel om databasen innehåller en tabell med en vektorkolumn .

Användardefinierade typer

  • Du kan inte skapa en aliastyp med hjälp av CREATE TYPE för typen vector. Denna begränsning liknar beteendet hos xml - och json-datatyperna .

Alltid Krypterad

  • Vektortypen stöds inte med funktionen Alltid krypterad.

Kända problemområden

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