Vektordatentyp

Gilt für: SQL Server 2025 (17.x) Azure SQL-DatenbankAzure SQL Managed InstanceSQL-Datenbank in Microsoft Fabric

Der Vektordatentyp speichert Vektordaten, die für Operationen wie Ähnlichkeitssuche und Anwendungen für maschinelles Lernen optimiert sind. Vektoren werden in einem optimierten Binärformat gespeichert, aber zur Bequemlichkeit als JSON-Arrays dargestellt. Jedes Element des Vektors wird als Einzelpräzisionswert (4-Byte) im Gleitkommaformat gespeichert.

Um Entwicklern eine vertraute Erfahrung zu bieten, wird der Vektordatentyp erstellt und als JSON-Array angezeigt. Beispielsweise kann ein Vektor mit drei Dimensionen als '[0.1, 2, 30]'dargestellt werden. Du kannst implizit und explizit zwischen dem Vektortyp und den Typen varchar, nvarchar und json konvertieren.

Weitere Informationen zum Arbeiten mit Vektordaten finden Sie unter:

Beispielsyntax

Die Verwendungssyntax für den Vektortyp ähnelt allen anderen SQL Server-Datentypen in einer Tabelle.

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

Standardmäßig ist der Basistyp float32. Um Halbpräzision zu verwenden, gib explizit float16 an.

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

Dimensions

Ein Vektor muss mindestens eine Dimension haben. Die maximale Anzahl der Dimensionen hängt vom Vektorbasistyp ab:

  • float32 unterstützt bis zu 1.998 Dimensionen.
  • float16 unterstützt bis zu 3.996 Dimensionen.

Verfügbarkeit von Funktionen

Der Vektordatentyp ist unter allen Datenbankkompatibilitätsstufen verfügbar. Wenn du keinen Basistyp angibst, verwendet der Vektor float32.

Vektor-Funktionen sind in Azure SQL Managed Instance verfügbar, die mit der Always-up-to-date-Richtlinie konfiguriert ist.

Halbpräzisions-Float16-Vektoren

  • Halbpräzisionsvektoren (float16) sind im Allgemeinen in Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Database in Microsoft Fabric verfügbar. Eine Vorschaukonfiguration ist nicht erforderlich.

  • In SQL Server 2025 (17.x) sind Halbpräzisionsvektoren (float16) in der Vorschau verfügbar. Um float16 in SQL Server 2025 zu verwenden, müssen Sie die PREVIEW_FEATURES Datenbank-Scoped-Konfigurationsoption aktivieren. Weitere Informationen finden Sie unter Vorschaufunktionen in SQL Server 2025 aktivieren.

Für weitere Informationen zu Halbpräzisionsvektoren siehe Halbpräzisions-Gleitmittelunterstützung im Vektordatentyp.

Vorschaufunktionen in SQL Server 2025 aktivieren

Für einige Vorschaufunktionen in SQL Server 2025 müssen Sie die datenbankbezogene Konfigurationsoption PREVIEW_FEATURES aktivieren.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Weitere Informationen finden Sie PREVIEW_FEATURES.

Examples

A. Spaltendefinition

Verwenden Sie den Vektortyp in Spaltendefinitionen innerhalb einer CREATE TABLE Anweisung. Beispiel:

Das folgende Beispiel erstellt eine Tabelle mit einer Vektor-Spalte und fügt Daten in diese ein.

Definieren Sie eine Vektorspalte in einer Tabelle, indem Sie entweder den Standardbasistyp float32 oder float16 für halbpräzise Speicherung verwenden.

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. Verwendung in Variablen

Das folgende Beispiel deklariert Vektoren mit dem neuen Vektordatentyp und berechnet Abstände mit der VECTOR_DISTANCE Funktion.

Verwenden Sie den Vektortyp mit Variablen:

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. Verwendung in gespeicherten Prozeduren oder Funktionen

Man kann den Vektordatentyp als Parameter in gespeicherten Prozeduren oder Funktionen verwenden. Beispiel:

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

Conversions

  • Du kannst den Vektortyp nicht mit dem sql_variant Typ verwenden oder ihn einer sql_variant Variablen oder Spalte zuweisen. Diese Einschränkung ähnelt varchar(max), varbinary(max), nvarchar(max), xml, json und CLR-basierten Datentypen.

Compatibility

Verbesserungen am TDS-Protokoll

SQL Server speichert Vektoren in einem optimierten Binärformat, macht sie aber als JSON-Arrays verfügbar.

Unterstützte Treiber verwenden Verbesserungen am TDS-Protokoll, um Vektordaten effizienter im Binärformat zu übertragen und anwendungen als systemeigene Vektortypen zu präsentieren. Dieser Ansatz reduziert die Größe des Payloads, eliminiert den Overhead des JSON-Parsing und bewahrt die volle Gleitkommagenauigkeit. Daher verbessert es sowohl die Leistung als auch die Genauigkeit bei der Arbeit mit hochdimensionalen Vektoren in KI- und Machine Learning-Szenarien.

Unterstützung von nativen Treibern

Anwendungen mit TDS Version 7.4 oder höher und aktualisierten Treibern können Vektordaten nativ lesen, schreiben, streamen und massenkopien.

Für diese Funktionen sind Versionen der folgenden Treiber erforderlich. Stellen Sie sicher, dass Sie die richtige Version verwenden, um die systemeigene Vektorunterstützung zu aktivieren.

  • Microsoft.Data.SqlClient: Version 6.1.0 führt den Typ SqlVector ein, der System.Data.SqlDbTypes erweitert.
  • Microsoft JDBC-Treiber für SQL Server: Version 13.1.0 Preview führt den microsoft.sql.Types.VECTOR Typ und die microsoft.sql.Vector Klasse ein.

Note

Native binärer Transport für float16-Vektoren wird in Microsoft JDBC Driver 13.4 für SQL Server und Microsoft ODBC Driver 18.7.1 für SQL Server unterstützt. Diese Treiber serialisieren und deserialisieren halbpräzise Vektorwerte mit dem nativen Drahtformat, wodurch die Netzwerknutzlast im Vergleich zur JSON-Darstellung reduziert wird. Verwenden Sie diese Treiberversionen oder später für den nativen float16-Transport . Treiber, die den nativen float16-Transport nicht unterstützen, können weiterhin mit Vektoren arbeiten, die als varchar(max) JSON-Arrays dargestellt werden.

Note

Für Clients, die das aktualisierte TDS-Protokoll nicht unterstützen, macht SQL Server weiterhin Vektordaten als varchar(max)- Typen verfügbar, um die Abwärtskompatibilität sicherzustellen. Clientanwendungen können mit Vektordaten arbeiten, als wäre es ein JSON-Array. Das SQL-Datenbankmodul konvertiert automatisch Vektoren in und aus einem JSON-Array, wodurch der neue Typ für den Client transparent wird. Daher sind Treiber und alle Sprachen automatisch mit dem neuen Typ kompatibel.

Sie können sofort mit der Verwendung des neuen Vektortyps beginnen. Die folgenden Beispiele zeigen verschiedene Sprachen und Treiberkonfigurationen.

Important

Erfordert Microsoft.Data.SqlClient 6.1.0 oder höher für native Vektorunterstützung.

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

Wenn du nicht die neuesten .NET-Treiber verwendest, kannst du trotzdem mit Vektordaten in C# arbeiten, indem du sie als JSON-String serialisiert und deserialisiert, indem du die Klasse nutztJsonSerializer. Dieser Ansatz stellt die Kompatibilität mit der varchar(max) Darstellung der Vektoren sicher, die SQL Server für ältere Clients bereitstellt.

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

Die folgenden Tools unterstützen den Vektordatentyp :

Limitations

Der Vektortyp hat die folgenden Einschränkungen:

Tables

  • Einschränkungen auf Spaltenebene werden nicht unterstützt, außer den Einschränkungen NULL und NOT NULL.

    • DEFAULT und CHECK Einschränkungen werden für Vektorspalten nicht unterstützt.

    • Schlüsseleinschränkungen, wie PRIMARY KEY oder FOREIGN KEY, werden für Vektorspalten nicht unterstützt. Gleichheit, Eindeutigkeit, Verknüpfungen mithilfe von Vektorspalten als Schlüssel und Sortierreihenfolgen gelten nicht für Vektordatentypen .

    • Es gibt keine Vorstellung von Eindeutigkeit für Vektoren, sodass eindeutige Einschränkungen nicht anwendbar sind.

    • Die Überprüfung des Wertebereichs innerhalb eines Vektors ist nicht anwendbar.

  • Vektoren unterstützen keine Vergleichs-, Additions-, Subtraktions-, Multiplikations-, Divisions-, Verkettungs- oder anderen mathematischen, logischen und zusammengesetzten Zuordnungsoperatoren.

  • Man kann keine Vektorspalten in speicheroptimierten Tabellen verwenden.

Indexes

  • Man kann keine B-Baum-Indizes oder Spaltenspeicher-Indizes auf Vektorspalten verwenden. Man kann jedoch eine Vektorspalte als enthaltene Spalte in eine Indexdefinition einbeziehen.
  • Vektorindizes erzeugen einen approximativen Index auf einer Vektorspalte, um die Leistung der Suche nach den nächsten Nachbarn zu verbessern. Um mehr darüber zu erfahren, wie Vektorindexierung und Vektorsuche funktionieren und welche Unterschiede zwischen exakter und approximativer Suche sind, siehe Vektorsuche und Vektorindexe in der SQL Datenbank-Engine.

Tabellenschema-Metadaten

  • Das sp_describe_first_result_set System gespeicherte Prozedur gibt den Vektordatentyp nicht korrekt zurück. Daher sehen viele Datenzugriffsclients und -treiber einen Varchar - oder nvarchar-Datentyp .

Ledger-Tabellen

  • Das gespeicherte Verfahren sp_verify_database_ledger erzeugt einen Fehler, wenn die Datenbank eine Tabelle mit einer Vektorspalte enthält.

Benutzerdefinierte Typen

  • Du kannst keinen Alias-Typ mit CREATE TYPE für den Vektortyp erstellen. Diese Einschränkung ähnelt dem Verhalten der XML- und JSON-Datentypen .

Immer Verschlüsselt

  • Der Vektortyp wird mit der Funktion "Immer verschlüsselt" nicht unterstützt.

Bekannte Probleme

  • Die Datenmaskierung zeigt derzeit Vektordaten als varbinary Datentyp im Azure-Portal an.