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
undCHECK
werden für Vektor-Spalten nicht unterstützt. - Schlüsseleinschränkungen, z. B.
PRIMARY KEY
oderFOREIGN 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.
- Die Einschränkungen
- 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 Systemansichtsys.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 vonmax_length
zurückgegeben wird. Wenn Sie beispielsweise einemax_length
von 20 Bytes sehen, lautet die Anzahl der Dimensionen (20 - 8) / 4 = 3.
Konvertierungen
Implizite und explizite Konvertierung mithilfe von
CAST
oderCONVERT
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
undDATALENGTH
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.