Tipo di dati vector (anteprima)
Si applica a: Database SQL di Azure
Il tipo di dati vector è progettato per archiviare i dati vettoriali ottimizzati per operazioni come la ricerca di somiglianza e le applicazioni di Machine Learning. I vettori vengono archiviati in un formato binario ottimizzato, ma vengono esposti come matrici JSON per praticità. Ogni elemento del vettore viene archiviato come valore a virgola mobile a precisione singola (4 byte).
Nota
Questo tipo di dati è in anteprima ed è soggetto a modifiche. Assicurarsi di leggere le condizioni di utilizzo dell'anteprima nel documento Contratti di servizio (SLA) per Online Services . Per le limitazioni dell'anteprima corrente, vedere Limitazioni e problemi noti.
Per altre informazioni sull'uso dei dati Vector in database SQL, vedere:
Sintassi di esempio
La sintassi di utilizzo per il tipo vector è simile a tutti gli altri tipi di dati di SQL Server in una tabella.
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
Dimensioni
Un vettore deve avere almeno una dimensione. Il numero massimo di dimensioni supportate è 1998.
Esempi
R. Definizione di colonna
Il tipo di vettore può essere usato nella definizione di colonna contenuta in un'istruzione CREATE TABLE
, ad esempio:
Nell'esempio seguente viene creata una tabella con una colonna vettoriale e vengono inseriti dati.
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. Utilizzo nelle variabili
Nell'esempio seguente vengono dichiarati vettori usando il nuovo tipo di dati vector e vengono calcolate le distanze usando la VECTOR_DISTANCE
funzione .
Il tipo di vettore può essere usato con le variabili:
DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
C. Utilizzo in stored procedure o funzioni
Il tipo di dati vector può essere usato come parametro in stored procedure o funzioni. Ad esempio:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Disponibilità di funzionalità
Il supporto nativo per i vettori è attualmente in anteprima in database SQL di Azure.
Il nuovo tipo di vettore è disponibile in tutti i livelli di compatibilità del database.
Compatibilità
Per consentire a tutti i client di operare sui dati vettoriali, i vettori vengono esposti come tipi varchar(max). Le applicazioni client possono usare i dati vettoriali come se fosse una matrice JSON. Il motore convertirà automaticamente i vettori in e da una matrice JSON, rendendo trasparente il nuovo tipo per il client. Grazie a questo approccio tutti i driver e tutte le lingue sono automaticamente compatibili con il nuovo tipo.
È possibile iniziare subito a usare il nuovo tipo di vettore. Ecco alcuni esempi:
Con C#, i vettori possono essere serializzati e deserializzati da e verso stringhe usando la JsonSerializer
classe .
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));
}
}
Limiti
L'anteprima in corso presenta le limitazioni seguenti:
Tabelle
- I vincoli a livello di colonna non sono supportati, ad eccezione dei
NULL
/NOT NULL
vincoli.DEFAULT
i vincoli eCHECK
non sono supportati per le colonne vettoriali .- I vincoli di chiave, ad esempio
PRIMARY KEY
oFOREIGN KEY
, non sono supportati per le colonne vettoriali . Uguaglianza, univocità, join che usano colonne vettoriali come chiavi e gli ordini di ordinamento non si applicano ai tipi di dati vettoriali . - Non esiste alcuna nozione di univocità per i vettori, quindi i vincoli univoci non sono applicabili.
- Anche il controllo dell'intervallo di valori all'interno di un vettore non è applicabile.
- I vettori non supportano il confronto, l'addizione, la sottrazione, la moltiplicazione, la divisione, la concatenazione o qualsiasi altro operatore di assegnazione matematica, logica e composta.
- le colonne vettoriali non possono essere usate nelle tabelle ottimizzate per la memoria.
- La modifica delle colonne vettoriali con
ALTER TABLE ... ALTER COLUMN
altri tipi di dati non è consentita.
Metadati dello schema di tabella
sp_describe_first_result_set stored procedure di sistema non restituisce correttamente il tipo di dati vector. Di conseguenza, molti client e driver di accesso ai dati vedono un tipo di dati varchar o nvarchar .
INFORMATION_SCHEMA.COLUMNS
segnala le colonne usando il tipo vector come varbinary. Una soluzione alternativa per ottenere il tipo di dati corretto consiste nell'usaresys.columns
la visualizzazione di sistema.sys.columns
restituisce la lunghezza del vettore in byte. Per ottenere il numero di dimensioni, utilizzare la formula seguente:dimensions = (length - 8) / 4
dove
length
è il valore restituito damax_length
. Ad esempio, se viene visualizzato unmax_length
valore di 20 byte, il numero di dimensioni è (20 - 8) / 4 = 3.
Conversioni
È possibile eseguire la conversione implicita ed esplicita usando o dal tipo vector ai tipi varchar e nvarchar Analogamente, solo varchar e nvarchar possono essere convertiti in modo implicito o esplicito nel tipo vector.
CONVERT
CAST
Il tipo di vettore non può essere usato con il tipo sql_variant o assegnato a una variabile o a una colonna sql_variant . Questa restrizione è simile ai tipi di dati varchar(max), varbinary(max), nvarchar(max), xml, json e CLR.
Il cast da e verso il tipo di dati JSON non è ancora supportato. La soluzione alternativa consiste nel convertire prima da/in nvarchar(max) e quindi in/da JSON. Ad esempio, per convertire un vettore in un tipo JSON:
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]'; SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
e per eseguire la conversione da un tipo JSON a vector:
DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30) SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
Indici
- Gli indici dell'albero B o gli indici columnstore non sono consentiti nelle colonne vettoriali . Tuttavia, una colonna vettoriale può essere specificata come colonna inclusa in una definizione di indice.
Tipi definiti dall'utente
- La creazione del tipo alias che usa
CREATE TYPE
per il tipo vector non è consentita, analogamente al comportamento dei tipi di dati xml e json .
Tabelle del libro mastro
- La stored procedure
sp_verify_database_ledger
genererà un errore se il database contiene una tabella con una colonna vettoriale .
Problemi noti
Nell'anteprima in corso sono presenti i problemi noti seguenti:
- Gli strumenti come SQL Server Management Studio, Azure Data Studio o l'estensione mssql per VS Code potrebbero attualmente non essere in grado di generare lo script di una tabella con una colonna usando il tipo di dati vector .
- Gli strumenti come SQL Server Management Studio, Azure Data Studio o l'estensione mssql per VS Code potrebbero attualmente segnalare un tipo di dati varbinary anziché un vettore per una colonna usando il tipo vector.
- BCP e
BULK INSERT
non funzionano attualmente se le tabelle contengono il tipo di vettore . - L'importazione e l'esportazione tramite DacFx non funzionano attualmente se è presente una tabella con tipo vettore .
- La crittografia della colonna attualmente non supporta il tipo di vettore .
- Always Encrypted attualmente non supporta il tipo di vettore .
- Maschera dati attualmente mostra i dati vettoriali come tipo di dati varbinary nel portale.
- Quando si passa un tipo di vettore a
LEN
eDATALENGTH
viene restituito l'errore 8116 (il vettore del tipo di dati argomento non è valido per l'argomento 1 della funzione datalength). - In alcuni casi quando si passa un vettore a una stored procedure o a una funzione, è possibile che venga visualizzato l'errore 42211 (il troncamento del vettore non è consentito durante la conversione). Una soluzione alternativa consiste nell'usare il tipo di vettore nvarchar(max).
Questi problemi verranno risolti negli aggiornamenti futuri e la documentazione verrà aggiornata di conseguenza.