Partager via


Type de données vectorielles (préversion)

s’applique à :Azure SQL Databasebase de données SQL dans Microsoft Fabric

Le type de données vecteur est conçu pour stocker les données vectorielles optimisées pour les opérations telles que la recherche de similarité et les applications Machine Learning. Les vecteurs sont stockés dans un format binaire optimisé, mais sont exposés sous forme de tableaux JSON pour des raisons pratiques. Chaque élément du vecteur est stocké sous forme de valeur à virgule flottante (4 octets) simple précision.

Remarque

Ce type de données est en préversion et peut être modifié. Veillez à lire les termes d’utilisation de la préversion dans le document Contrats de niveau de service (SLA) pour Services en ligne. Pour connaître les limitations de la préversion actuelle, consultez Limitations et problèmes connus.

Pour plus d’informations sur l’utilisation des données vectorielles, consultez :

Exemple de syntaxe

La syntaxe d’utilisation du type vecteur est similaire à tous les autres types de données SQL Server dans une table.

column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL] 

Dimensions

Un vecteur doit avoir au moins une dimension. Le nombre maximal de dimensions prises en charge est 1998.

Exemples

R. Définition de colonne

Le type de vecteur peut être utilisé dans la définition de colonne contenue dans une instruction CREATE TABLE, par exemple :

L’exemple suivant crée une table avec une colonne vectorielle et insère des données dans celle-ci.

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. Utilisation dans les variables

L’exemple suivant déclare des vecteurs à l’aide du nouveau type de données vecteur et calcule les distances à l’aide de la fonction VECTOR_DISTANCE.

Le type de vecteur peut être utilisé avec des variables :

DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;

C. Utilisation dans les procédures stockées ou les fonctions

Le type de données vecteur peut être utilisé comme paramètre dans la procédure stockée ou les fonctions. Par exemple :

CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
    SELECT @V;
    SET @V2 = @V;
END

Disponibilité des fonctionnalités

Le nouveau type vecteur est disponible sous tous les niveaux de compatibilité de base de données.

Compatibilité

Pour permettre à tous les clients d’opérer sur des données vectorielles, les vecteurs sont exposés en tant que types varchar(max). Les applications clientes peuvent utiliser des données vectorielles comme s’il s’agissait d’un tableau JSON. Le moteur convertit automatiquement les vecteurs vers et à partir d’un tableau JSON, ce qui rend le nouveau type transparent pour le client. Grâce à cette approche, tous les pilotes et toutes les langues sont automatiquement compatibles avec le nouveau type.

Vous pouvez commencer à utiliser immédiatement le nouveau type de vecteur. Voici quelques exemples :

Avec C#, les vecteurs peuvent être sérialisés et désérialisés vers et depuis une chaîne à l’aide de la classe 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));          
    }
}

Limites

La préversion en cours présente les limitations suivantes :

Tables

  • Les contraintes au niveau des colonnes ne sont pas prises en charge, à l’exception des contraintes NULL/NOT NULL.
    • Les contraintesDEFAULT et CHECK ne sont pas prises en charge pour les colonnes vecteur.
    • Les contraintes clés, telles que PRIMARY KEY ou FOREIGN KEY, ne sont pas prises en charge pour les colonnes vecteur. L’égalité, l’unicité, les jointures utilisant des colonnes vectorielles en tant que clés et les ordres de tri ne s’appliquent pas aux types de données vecteur.
    • Il n’existe aucune notion d’unicité pour les vecteurs, de sorte que les contraintes uniques ne s’appliquent pas.
    • La vérification de la plage de valeurs dans un vecteur n’est pas applicable.
  • Les vecteurs ne prennent pas en charge la comparaison, l’addition, la soustraction, la multiplication, la division, la concaténation ou tout autre opérateur d’assignation mathématique, logique et composée.
  • Les colonnes vecteur ne peuvent pas être utilisées dans les tables optimisées en mémoire.
  • La modification de colonnes vecteur utilisant ALTER TABLE ... ALTER COLUMN à d’autres types de données n’est pas autorisée.

Métadonnées de schéma de table

  • La procédure stockée système sp_describe_first_result_set ne retourne pas correctement le type de données vecteur. Par conséquent, de nombreux clients et pilotes d’accès aux données voient un type de données varchar ou nvarchar.

  • INFORMATION_SCHEMA.COLUMNS signale des colonnes utilisant type vecteur comme varbinary. Une solution de contournement pour obtenir le type de données correct consiste à utiliser la vue système sys.columns.

  • sys.columns retourne la longueur du vecteur en octets. Pour obtenir le nombre de dimensions, utilisez la formule suivante :

    dimensions = (length - 8) / 4
    

    length est la valeur retournée par max_length. Par exemple, si vous voyez une max_length de 20 octets, le nombre de dimensions est (20 - 8) / 4 = 3.

Conversions

  • La conversion implicite et explicite à l’aide de CAST ou de CONVERT à partir du type vecteur peut être effectuée pour les typesvarchar, et nvarchar de la même façon, uniquement varchar, et nvarchar peut être implicitement ou explicitement converti en type vecteur.

  • Le type vecteur ne peut pas être utilisé avec le type sql_variant ou affecté à une variable ou une colonne sql_variant. Cette restriction similaire à varchar(max), varbinary(max), nvarchar(max), xml, jsonet les types de données CLR.

  • La conversion vers et depuis le type de données JSON n'est pas encore prise en charge. La solution de contournement consiste d’abord à effectuer une conversion de/vers nvarchar(max), puis à partir de JSON. Par exemple, pour convertir un vecteur en type JSON :

    DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
    SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
    

    et à convertir d’un type JSON en vecteur :

    DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30)
    SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
    

Index

  • Les index B-tree ou les index columnstore ne sont pas autorisés sur les colonnes de vecteur. Toutefois, une colonne vecteur peut être spécifiée en tant que colonne incluse dans une définition d’index.

Types définis par l'utilisateur

  • La création d’un type d’alias à l’aide de CREATE TYPE pour le type de vecteur n’est pas autorisée, comme le comportement des types de données xml et json.

Tables de registre

  • La procédure stockée sp_verify_database_ledger génère une erreur si la base de données contient une table avec une colonne vecteur.

Problèmes connus

Dans la préversion en cours, il existe les problèmes connus suivants :

  • Les outils tels que SQL Server Management Studio, Azure Data Studio ou l’extension mssql pour VS Code peuvent actuellement ne pas être en mesure de générer le script d’une table qui a une colonne à l’aide du type de données vecteur.
  • Les outils tels que SQL Server Management Studio, Azure Data Studio ou l’extension mssql pour VS Code peuvent actuellement signaler un type de données de varbinary au lieu de vecteur pour une colonne à l’aide du type vecteur.
  • BCP et BULK INSERT ne fonctionnent pas actuellement si les tables contiennent le type vecteur.
  • L’importation et l’exportation via DacFx ne fonctionnent actuellement pas si une table utilise le type de vecteur.
  • Le chiffrement de colonne ne prend actuellement pas en charge le type vecteur.
  • Always Encrypted ne prend actuellement pas en charge le type de vecteur.
  • Le masquage des données affiche actuellement données de vecteur comme type de données varbinary dans le portail.
  • Lors du passage d’un type de vecteur à LEN et DATALENGTH l’erreur 8116 (le vecteur de type de données argumenté n’est pas valide pour l’argument 1 de la fonction datalength) est retournée.
  • Dans certains cas, lorsque vous passez un vecteur à une procédure stockée ou à une fonction, vous pouvez obtenir l’erreur 42211 (la troncature du vecteur n’est pas autorisée pendant la conversion). Une solution de contournement consiste à utiliser nvarchar(max) à la place type de vecteur.

Ces problèmes seront résolus dans les futures mises à jour et la documentation sera mise à jour en conséquence.