Condividi tramite


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 e CHECK non sono supportati per le colonne vettoriali .
    • I vincoli di chiave, ad esempio PRIMARY KEY o FOREIGN 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'usare sys.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 da max_length. Ad esempio, se viene visualizzato un max_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 e DATALENGTH 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.