Freigeben über


Datentyp „Vektor“ (Vorschau)

Gilt für:Azure SQL-DatenbankSQL-Datenbank in Microsoft Fabric

Der Datentyp Vektor wurde entwickelt, um Vektordaten zu speichern, die für Vorgänge wie Ähnlichkeitssuche und ML-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.

Hinweis

Dieser Datentyp befindet sich in der Vorschau und kann geändert werden. Lesen Sie die Nutzungsbedingungen für die Vorschau im Dokument Vereinbarungen zum Servicelevel (Service Level Agreements, SLAs) für Onlinedienste. Einschränkungen der aktuellen Vorschau finden Sie unter Einschränkungen und Bekannte Probleme.

Weitere Informationen zum Arbeiten mit Vektordaten finden Sie unter:

Beispielsyntax

Die Verwendungssyntax für den Typ Vektor ä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

A. Spaltendefinition

Der Typ Vektor 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]');

SELECT * FROM dbo.vectors;

B. Verwendung in Variablen

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

Der Typ Vektor kann mit Variablen verwendet werden:

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

C. Verwendung in gespeicherten Prozeduren oder Funktionen

Der Datentyp Vektor 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 Typ Vektor ist unter allen Datenbankkompatibilitätsebenen verfügbar.

Kompatibilität

Damit alle Clients Vektordaten verwenden können, werden Vektoren als varchar(max)-Typen verfügbar gemacht. Clientanwendungen können mit Vektordaten arbeiten, als wären sie ein JSON-Array. Das Modul wird Vektoren automatisch in und aus einem JSON-Array konvertieren, wodurch der neue Typ für den Client transparent wird. Dank diesem Ansatz sind alle Treiber und alle Sprachen automatisch mit dem neuen Typ kompatibel.

Sie können sofort mit der Verwendung des neuen Typs „Vektor“ beginnen. Dies sind einige Beispiele:

Mit C# können Vektoren mithilfe der Klasse JsonSerializer von und zu Zeichenfolgen serialisiert und deserialisiert werden.

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

Begrenzungen

Für die laufende Vorschau gelten folgende Einschränkungen:

Tabellen

  • Einschränkungen auf Spaltenebene werden nicht unterstützt, mit Ausnahme der Einschränkungen NULL/NOT NULL.
    • Die Einschränkungen DEFAULT und CHECK werden für Vektor-Spalten nicht unterstützt.
    • Schlüsseleinschränkungen, z. B. PRIMARY KEY oder FOREIGN KEY, werden für Vektor-Spalten nicht unterstützt. Gleichheit, Eindeutigkeit, Verknüpfungen mithilfe von Vektorspalten als Schlüssel und Sortierreihenfolgen gelten nicht für Vektor-Datentypen.
    • Für Vektoren gibt es kein Konzept der Eindeutigkeit, daher sind eindeutige Beschränkungen nicht anwendbar.
    • Das Überprüfen des Wertebereichs innerhalb eines Vektors ist ebenfalls nicht anwendbar.
  • Vektoren unterstützen keinen Vergleich, keine Addition, Subtraktion, Multiplikation, Division, Verkettung oder andere mathematische, logische und zusammengesetzte Zuweisungsoperatoren.
  • Vektor-Spalten können nicht in speicheroptimierten Tabellen verwendet werden.
  • Das Ändern von Vektor-Spalten in andere Datentypen mithilfe von ALTER TABLE ... ALTER COLUMN ist nicht zulässig.

Tabellenschema-Metadaten

  • Die vom System gespeicherte Prozedur sp_describe_first_result_set gibt den Datentyp Vektor nicht korrekt zurück. Daher sehen viele Datenzugriffsclients und Treiber einen Datentyp varchar oder nvarchar.

  • INFORMATION_SCHEMA.COLUMNS berichtet Spalten mithilfe des Typs Vektor als varbinary. Eine Problemumgehung zum Erhalten des richtigen Datentyps besteht darin, die Systemansicht sys.columns zu verwenden.

  • sys.columns gibt die Länge des Vektors in Bytes zurück. Verwenden Sie die folgende Formel, um die Anzahl der Dimensionen abzurufen:

    dimensions = (length - 8) / 4
    

    wo length der Wert ist, der von max_length zurückgegeben wird. Wenn Sie beispielsweise eine max_length von 20 Bytes sehen, lautet die Anzahl der Dimensionen (20 - 8) / 4 = 3.

Konvertierungen

  • Implizite und explizite Konvertierung mithilfe vonCAST oder CONVERT aus dem Typ Vektor kann in varchar- oder nvarchar-Typen durchgeführt werden. Gleichermaßen können nur varchar und nvarchar implizit oder explizit in den Typ Vektor konvertiert werden.

  • Der Typ Vektor kann nicht mit dem Typ sql_variant verwendet oder einer sql_variant-Variable oder -Spalte zugewiesen werden. Diese Einschränkung ist ähnlich wie bei varchar(max)-, varbinary(max)-, nvarchar(max)-, xml-, json- und CLR-basierten Datentypen.

  • Das Casting zum und vom JSON-Datentyp wird noch nicht unterstützt. Die Problemumgehung besteht darin, zuerst von/zu nvarchar(max) und dann zu/von JSON zu konvertieren. So konvertieren Sie beispielsweise einen Vektor in einen JSON-Typ:

    DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
    SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
    

    und um von einem JSON-Typ in einen Vektor zu konvertieren:

    DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30)
    SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
    

Indizes

  • B-Strukturindizes oder Columnstore-Indizes sind für Vektor-Spalten nicht zulässig. Eine Vektor-Spalte kann jedoch als eingeschlossene Spalte in einer Indexdefinition angegeben werden.

Benutzerdefinierte Typen

  • Die Erstellung eines Aliastyps mithilfe von CREATE TYPE für den Typ Vektor ist nicht zulässig, ähnlich zum Verhalten der Datentypen xml und json.

Ledgertabellen

  • Die gespeicherte Prozedur sp_verify_database_ledger wird einen Fehler generieren, wenn die Datenbank eine Tabelle mit einer Vektor-Spalte enthält.

Bekannte Probleme

In der laufenden Vorschau gibt es die folgenden bekannten Probleme:

  • Tools wie SQL Server Management Studio, Azure Data Studio oder die mssql-Erweiterung für VS Code sind derzeit möglicherweise nicht in der Lage, das Skript einer Tabelle zu erstellen, die eine Spalte mit dem Datentyp Vektor enthält.
  • Tools wie SQL Server Management Studio, Azure Data Studio oder die mssql-Erweiterung für VS Code melden derzeit möglicherweise einen Datentyp von varbinary anstelle von Vektor für eine Spalte mit dem Typ Vektor.
  • BCP und BULK INSERT funktionieren derzeit nicht, wenn Tabellen den Typ Vektor enthalten.
  • Der Import und Export über DacFx funktioniert derzeit nicht, wenn eine Tabelle den Typ Vektor verwendet.
  • Die Spaltenverschlüsselung unterstützt derzeit den Typ Vektor nicht.
  • Always Encrypted unterstützt derzeit den Typ Vektor nicht.
  • Die Datenmaskierung zeigt derzeit Vektor-Daten als Datentyp varbinary im Portal an.
  • Beim Übergeben eines Vektortyps an LEN und DATALENGTH wird Fehler 8116 (Argument-Datentypvektor ist für Argument 1 der Datalength-Funktion ungültig) zurückgegeben.
  • Wenn Sie einen Vektor an eine gespeicherte Prozedur oder eine Funktion übergeben, wird in einigen Fällen möglicherweise Fehler 42211 (Abschneiden des Vektors ist während der Konvertierung nicht zulässig) angezeigt. Eine Problemumgehung besteht darin, nvarchar(max) anstelle eines Vektortyps zu verwenden.

Diese Probleme werden in zukünftigen Updates behoben und die Dokumentation entsprechend aktualisiert werden.