Freigeben über


Vektordatentyp

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

Der Vektordatentyp wurde entwickelt, um Vektordaten zu speichern, die für Vorgänge wie Ähnlichkeitssuche und Machine Learning-Anwendungen 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. Die implizite und explizite Konvertierung von und in den Vektortyp kann mithilfe von varchar-, nvarchar- und json-Typen erfolgen.

Note

SQL Server 2025 (17.x) unterstützt Halbgenauigkeitsvektoren (float16). Weitere Informationen finden Sie unter Halbpräzisions-Float-Unterstützung im Vektordatentyp.

float16 Vektor ist zurzeit für die Vorschau verfügbar. Aktivieren Sie zum Testen die Konfigurationsoption für den PREVIEW_FEATURES Datenbankbereich. Details erhalten Sie unter PREVIEW_FEATURES = { ON | OFF }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Überprüfen Sie einschränkungen und bekannte Probleme.

Note

Vektorfeatures sind in azure SQL Managed Instance verfügbar, die mit der Richtlinie [Always-up-to-date](/azure/azure-sql/managed-instance/ update-policy#always-up-to-date-update-policy) konfiguriert ist.

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 float32der Basistyp . Um die Halbgenauigkeit zu verwenden, müssen Sie explizit angeben float16 .

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

Dimensions

Ein Vektor muss mindestens eine Dimension haben. Die maximale Anzahl der unterstützten Dimensionen beträgt 1998.

Examples

A. Spaltendefinition

Der Vektortyp kann in der Spaltendefinition verwendet werden, die in einer CREATE TABLE Anweisung enthalten ist, z. B.:

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

Sie können eine Vektorspalte in einer Tabelle entweder mithilfe des Standardbasistyps definieren (float32) oder explizit für die Speicherung in halber Genauigkeit angeben float16.

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

Im folgenden Beispiel werden Vektoren mithilfe des neuen Vektordatentyps deklariert und Entfernungen mithilfe der VECTOR_DISTANCE Funktion berechnet.

Der Vektortyp kann mit Variablen verwendet werden:

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

C. Verwendung in gespeicherten Prozeduren oder Funktionen

Der Vektordatentyp kann als Parameter in gespeicherten Prozeduren oder Funktionen verwendet werden. Beispiel:

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

Verfügbarkeit von Funktionen

Der neue Vektortyp ist unter allen Datenbankkompatibilitätsebenen verfügbar.

Die Unterstützung für float16 Vektoren ist derzeit über die PREVIEW_FEATURES Konfiguration eingeschränkt. Sie müssen es explizit aktivieren, bevor Sie es verwenden VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • Der Vektortyp kann nicht mit dem sql_variant Typ verwendet oder einer sql_variant Variablen oder Spalte zugewiesen werden. 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.

Note

float16 Vektoren werden derzeit als varchar(max) (JSON-Array) über TDS übertragen. Die Unterstützung für den binären Transport von float16 in Treibern wie ODBC, JDBC und .NET ist noch nicht verfügbar.

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

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 Sie die neuesten .NET-Treiber nicht verwenden, können Sie weiterhin mit Vektordaten in C# arbeiten, indem Sie sie mithilfe der JsonSerializer Klasse serialisieren und deserialisieren. Dies gewährleistet die Kompatibilität mit der varchar(max)-Darstellung von Vektoren, die von SQL Server für ältere Clients zur Verfügung gestellt wird.

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, mit Ausnahme von NULL/NOT NULL Einschränkungen.

    • 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.

    • Das Überprüfen des Wertebereichs innerhalb eines Vektors ist ebenfalls nicht anwendbar.

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

  • Vektorspalten können nicht in speicheroptimierten Tabellen verwendet werden.

Indexes

  • B-Baum-Indizes oder Columnstore-Indizes sind auf Vektor-Spalten nicht zulässig. Eine Vektorspalte kann jedoch als eingeschlossene Spalte in einer Indexdefinition angegeben werden.

Tabellenschema-Metadaten

  • sp_describe_first_result_set gespeicherte Systemprozedur gibt den Vektordatentyp nicht ordnungsgemäß zurück. Daher sehen viele Datenzugriffsclients und Treiber einen Varchar - oder nvarchar-Datentyp .

Ledger-Tabellen

  • Gespeicherte Prozedur sp_verify_database_ledger generiert einen Fehler, wenn die Datenbank eine Tabelle mit einer Vektorspalte enthält.

Benutzerdefinierte Typen

  • Die Erstellung des Aliastyps, CREATE TYPE der für den Vektortyp verwendet wird, ist nicht zulässig, ähnlich wie das Verhalten der XML- und JSON-Datentypen.

Immer Verschlüsselt

  • Der Vektortyp wird mit dem Feature "Immer verschlüsselt" nicht unterstützt.

Bekannte Probleme

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