Datový typ vektoru (náhled)
platí pro:Azure SQL DatabaseSQL database v Microsoft Fabric
Datový typ vektoru je navržený tak, aby ukládal vektorová data optimalizovaná pro operace, jako je vyhledávání podobnosti a aplikace strojového učení. Vektory jsou uloženy v optimalizovaném binárním formátu, ale jsou zpřístupněny jako pole JSON pro usnadnění. Každý prvek vektoru je uložen jako číslo v plovoucí řádové čárce s jednoduchou přesností (4 bajty).
Poznámka
Tento datový typ je ve verzi Preview a může se změnit. Nezapomeňte si přečíst podmínky použití verze Preview v dokumentu Smlouvy o úrovni služeb (SLA) pro online služby. Omezení aktuálního náhledu najdete v tématu Omezení a Známé problémy.
Další informace o práci s vektorovými daty najdete tady:
Ukázková syntaxe
Syntaxe použití pro typ vektoru je podobná všem ostatním datovým typům SQL Serveru v tabulce.
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
Dimenze
Vektor musí mít alespoň jednu dimenzi. Maximální počet podporovaných dimenzí je 1998.
Příklady
A. Definice sloupce
Typ vektoru lze použít v definici sloupce obsaženém v příkazu CREATE TABLE
, například:
Následující příklad vytvoří tabulku s vektorovým sloupcem a vloží do ní data.
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. Použití v proměnných
Následující příklad deklaruje vektory pomocí nového vektoru datového typu a vypočítá vzdálenosti pomocí funkce VECTOR_DISTANCE
.
Typ vektoru lze použít s proměnnými:
DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
C. Použití v uložených procedurách nebo funkcích
Datový typ vektoru lze použít jako parametr v uložené proceduře nebo funkcích. Například:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Dostupnost funkcí
Nový typ vektoru je k dispozici na všech úrovních kompatibility databáze.
Kompatibilita
Aby mohli všichni klienti pracovat s vektorovými daty, jsou vektory vystavené jako varchar(max) typy. Klientské aplikace můžou pracovat s vektorovými daty, jako by šlo o pole JSON. Motor automaticky převede vektory do a z pole JSON, takže nový typ bude pro klienta transparentní. Díky tomuto přístupu jsou všechny ovladače a všechny jazyky automaticky kompatibilní s novým typem.
Nový typ vektoru můžete začít hned používat. Tady je několik příkladů:
V jazyce C# lze vektory serializovat a deserializovat do a z řetězce pomocí třídy JsonSerializer
.
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));
}
}
Omezení
Průběžná verze Preview má následující omezení:
Tabulky
- Omezení na úrovni sloupců nejsou podporována s výjimkou omezení
NULL
/NOT NULL
.-
DEFAULT
a omezeníCHECK
nejsou podporována pro sloupce vektoru. - U vektorových sloupců se nepodporují klíčová omezení, jako jsou
PRIMARY KEY
neboFOREIGN KEY
. Rovnost, jedinečnost, spojení využívající vektorové sloupce jako klíče a pořadí řazení se nevztahují na datové typy. - Neexistuje žádný pojem jedinečnosti vektorů, takže jedinečná omezení nejsou použitelná.
- Kontrola rozsahu hodnot v rámci vektoru se také nedá použít.
-
- Vektory nepodporují porovnání, sčítání, odčítání, násobení, dělení, zřetězení ani žádné jiné matematické, logické a složené operátory přiřazení.
- vektorové sloupce nelze použít v tabulkách optimalizovaných pro paměť.
- Změna vektoru sloupců pomocí
ALTER TABLE ... ALTER COLUMN
na jiné datové typy není povolená.
Metadata schématu tabulky
sp_describe_first_result_set systémová uložená procedura nevrací správně datový typ vektoru . Mnoho klientů a ovladačů pro přístup k datům proto vidí datový typ varchar nebo nvarchar.
INFORMATION_SCHEMA.COLUMNS
sestavy sloupce pomocí vektoru typu jako varbinární. Alternativním řešením pro získání správného datového typu je použitísys.columns
systémového zobrazení.sys.columns
vrátí délku vektoru v bajtech. Pokud chcete získat počet dimenzí, použijte následující vzorec:dimensions = (length - 8) / 4
kde
length
je hodnota vrácenámax_length
. Pokud se například zobrazímax_length
20 bajtů, počet dimenzí je (20 – 8) / 4 = 3.
Konverzace
Implicitní a explicitní převod pomocí
nebo z typu vektoru lze provést na varchar anvarchar , a podobně pouzevarchar anvarchar lze implicitně nebo explicitně převést na typ vektoru. Vektorový typ nelze použít s typem sql_variant ani jej přiřadit k proměnné nebo sloupci typu sql_variant. Toto omezení je podobné varchar(max), varbinary(max), nvarchar(max), xml, jsona datovým typům na bázi CLR.
Přetypování na a z datového typu JSON se zatím nepodporuje. Alternativním řešením je nejprve převést z/na nvarchar(max) a pak do/z FORMÁTU JSON. Pokud chcete například převést vektor na typ JSON:
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]'; SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
a převést z typu JSON na vektor:
DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30) SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
Indexy
- Indexy stromu B ani columnstore indexy nejsou povoleny na sloupcích s vektory . Vektor sloupec je však možné zadat jako zahrnutý sloupec v definici indexu.
Uživatelem definované typy
- Vytvoření typu aliasu pomocí
CREATE TYPE
pro typ vektoru není povolené, podobně jako chování xml a datových typů json.
Tabulky registru
- Uložená procedura
sp_verify_database_ledger
vygeneruje chybu, pokud databáze obsahuje tabulku s vektorem sloupce.
Známé problémy
V probíhající verzi Preview existují následující známé problémy:
- Nástroje, jako je SQL Server Management Studio, Azure Data Studio nebo rozšíření mssql pro VS Code, momentálně nemusí být schopné vygenerovat skript tabulky, která má sloupec pomocí datového typu vektoru.
- Nástroje jako SQL Server Management Studio, Azure Data Studio nebo rozšíření mssql pro VS Code mohou v současné době hlásit datový typ varbinary místo vector pro sloupec využívající typ vector.
- BCP a
BULK INSERT
momentálně nefungují, pokud tabulky obsahují typ vektoru . - Import a export přes DacFx v současné době nefunguje, pokud existuje tabulka používající vektorový typ
. - Šifrování sloupců v současné době nepodporuje typ vektoru .
- Funkce Always Encrypted v současné době nepodporuje typ vektoru .
- Maskování dat aktuálně zobrazuje vektor data jako varbinární datový typ na portálu.
- Při předávání vektoru typu do
LEN
aDATALENGTH
je vrácena chyba 8116 (argument datového typu vektor je neplatný pro argument 1 funkce datalength). - V některých případech, když předáte vektor uložené proceduře nebo funkci, může se zobrazit chyba 42211 (Během převodu není povoleno zkrácení vektoru). Alternativním řešením je použít nvarchar(max) místo typu vektor.
Tyto problémy budou opraveny v budoucích aktualizacích a odpovídajícím způsobem se aktualizují dokumentace.
Související obsah
- Přehled vektorů v databázovém stroji SQL
- Inteligentní aplikace
- funkce vektoru