Freigeben über


Vektordatentyp

Gilt für: SQL Server 2025 (17.x) Vorschau der 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, werden jedoch der Einfachheit halber als JSON-Arrays verfügbar gemacht. Jedes Element des Vektors wird als ein Gleitkommawert mit einfachen Genauigkeit (4 Byte) 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 zum Vektortyp kann mithilfe von varchar-, nvarchar - und json-Typen erfolgen.

Hinweis

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

Vektor-Funktionen sind in Azure SQL Managed Instance verfügbar, die mit der Always-up-to-date-Richtlinie 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] 

Maße

Ein Vektor muss mindestens eine Dimension aufweisen. Die maximale Anzahl unterstützter Dimensionen beträgt 1998.

Beispiele

Ein. 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 Vektorspalte und fügt Daten in diese ein.

CREATE TABLE dbo.vectors
(
  id INT PRIMARY KEY,
  v VECTOR(3) NOT NULL
);

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 VECTOR(3) = '[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. Zum Beispiel:

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

Featureverfügbarkeit

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

Konvertierungen

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

Kompatibilität

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 unten aufgeführten 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 SqlVector Typ ein, der erweitert wird System.Data.SqlDbTypes.
  • 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.

Hinweis

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.

Von Bedeutung

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

static void InsertNonNullVal(SqlConnection conn)
{
    Console.WriteLine("Inserting non-null value with SqlDbType");

    using SqlCommand command = new SqlCommand("INSERT INTO dbo.vectors VALUES (@Id, @VectorData)", conn);

    command.Parameters.AddWithValue("@Id", 1);

    var vectorParameter = new SqlParameter("@VectorData", Microsoft.Data.SqlDbTypeExtensions.Vector);
    vectorParameter.Value = new Microsoft.Data.SqlTypes.SqlVectorFloat32(new float[] { 3.14159f, 1.61803f, 1.41421f });
    command.Parameters.Add(vectorParameter);

    command.ExecuteNonQuery();
}

static void ReadWithGetValue(SqlConnection connection)
{
    Console.WriteLine("Reading values using GetValue method:");

    using (SqlCommand commandSourceData = new SqlCommand("SELECT v FROM dbo.vectors;", connection))
    using (SqlDataReader reader = commandSourceData.ExecuteReader())
    while (reader.Read())
    {
        var vector = reader.GetValue(0);        
        if (vector != null && vector != DBNull.Value)
        {
            Console.WriteLine("Type: " + vector.GetType() + " Element Count: " + ((SqlVectorFloat32)vector).Length);

            var values = ((SqlVectorFloat32)vector).Values;
            Console.WriteLine("Values: " + string.Join(", ", values));
        }              
    }
}

Hinweis

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

Werkzeuge

Die folgenden Tools unterstützen den Vektordatentyp :

Begrenzungen

Der Vektortyp hat die folgenden Einschränkungen:

Tabellen

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

Indizes

  • B-Strukturindizes oder Spaltenspeicherindizes sind für Vektorspalten 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 .

Ledgertabellen

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