Freigeben über


Datentyp „Vektor“ (Vorschau)

Gilt für:Azure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-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.

Hinweis

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

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

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.
    • DEFAULT und CHECK Einschränkungen werden für Vektorspalten nicht unterstützt.
    • Schlüsseleinschränkungen wie z. B. 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 .
    • 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.
  • Vektorspalten können nicht in speicheroptimierten Tabellen verwendet werden.
  • Das Ändern von Vektorspalten mithilfe von ALTER TABLE ... ALTER COLUMN in andere Datentypen ist nicht zulässig.

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 .

  • INFORMATION_SCHEMA.COLUMNS meldet Spalten 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 von CAST oder CONVERT aus dem Vektortyp kann in varchar und nvarchar-Typen durchgeführt werden. Ebenso können nur varchar und nvarchar implizit oder explizit in den Vektortyp konvertiert werden.

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

  • Das Casting zum und vom JSON-Datentyp wird noch nicht unterstützt. Die Problemumgehung besteht darin, zuerst von/in nvarchar(max) und dann in/aus 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-Baum-Indizes oder Columnstore-Indizes sind für Vektorspalten nicht zulässig. Eine Vektorspalte kann jedoch als eingeschlossene Spalte in einer Indexdefinition angegeben werden.

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.

Ledgertabellen

  • Die gespeicherte Prozedur sp_verify_database_ledger generiert einen Fehler, wenn die Datenbank eine Tabelle mit einer Vektorspalte 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 können derzeit möglicherweise nicht das Skript einer Tabelle mit einer Spalte mit dem Vektordatentyp generieren.
  • 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 des Vektors für eine Spalte mit dem Vektortyp .
  • BCP und BULK INSERT funktionieren derzeit nicht, wenn Tabellen den Vektortyp enthalten.
  • Der Import und Export über DacFx funktioniert derzeit nicht, wenn eine Tabelle einen Vektortyp verwendet.
  • Die Spaltenverschlüsselung unterstützt derzeit nicht den Vektortyp .
  • Always Encrypted unterstützt derzeit nicht den Vektortyp .
  • Die Datenmaskierung zeigt derzeit Vektordaten als varbinary-Datentyp im Portal an.
  • Beim Übergeben eines Vektortyps an LEN und DATALENGTH wird der Fehler 8116 zurückgegeben (Der Argument-Datentyp 'Vektor' ist für Argument 1 der Funktion 'datalength' ungültig).
  • 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, stattdessen den Vektortypnvarchar(max) zu verwenden.

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