Compartir a través de


Tipo de datos vectorial (versión preliminar)

Se aplica a: Azure SQL Database

El vector tipo de datos está diseñado para almacenar datos vectoriales optimizados para operaciones como la búsqueda de similitud y las aplicaciones de aprendizaje automático. Los vectores se almacenan en un formato binario optimizado, pero se exponen como matrices JSON para mayor comodidad. Cada elemento del vector se almacena como un valor de punto flotante de precisión sencilla (4 bytes).

Nota:

Este tipo de datos está en versión preliminar y está sujeto a cambios. Asegúrese de leer los términos de uso de la versión preliminar en el documento Acuerdo de Nivel de Servicio (SLA) para servicios en línea. Para ver las limitaciones de la versión preliminar actual, consulte Limitaciones y Problemas conocidos.

Para obtener más información sobre cómo trabajar con datos vectoriales en SQL Database, consulte:

Sintaxis de ejemplo

La sintaxis de uso del tipo vector es similar a todos los demás tipos de datos de SQL Server de una tabla.

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

Dimensiones

Un vector debe tener al menos una dimensión. El número máximo de dimensiones admitidas es 1998.

Ejemplos

A Definición de columnas

El tipo vector se puede usar en la definición de columna contenida en una instrucción CREATE TABLE, por ejemplo:

En el ejemplo siguiente se crea una tabla con una columna vectorial y se insertan datos en ella.

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. Uso en variables

En el ejemplo siguiente se declaran vectores mediante el nuevo tipo de datos vector y se calculan las distancias mediante la función VECTOR_DISTANCE.

El tipo vector se puede usar con variables:

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

C. Uso en procedimientos almacenados o funciones

El tipo de datos vector se puede usar como parámetro en funciones o procedimientos almacenados. Por ejemplo:

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

Disponibilidad de características

La compatibilidad nativa con vectores se encuentra actualmente en versión preliminar en Azure SQL Database.

El nuevo tipo vector está disponible en todos los niveles de compatibilidad de la base de datos.

Compatibilidad

Para permitir que todos los clientes puedan operar en datos vectoriales, los vectores se exponen como tipos de varchar(max). Las aplicaciones cliente pueden trabajar con datos vectoriales como si fuera una matriz JSON. El motor convertirá automáticamente los vectores en y desde una matriz JSON, lo que hará que el nuevo tipo sea transparente para el cliente. Gracias a este enfoque, todos los controladores y todos los idiomas son automáticamente compatibles con el nuevo tipo.

Puede empezar a usar el nuevo tipo de vector inmediatamente. A continuación, se ponen algunos ejemplos:

Con C#, los vectores se pueden serializar y deserializar hacia y desde una cadena mediante la clase 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));          
    }
}

Limitaciones

La versión preliminar en curso tiene las siguientes limitaciones:

Tablas

  • No se admiten restricciones de nivel de columna, excepto las restricciones de NULL/NOT NULL.
    • No se admiten restricciones DEFAULT y CHECK para columnas de vector.
    • No se admiten restricciones de clave, como PRIMARY KEY o FOREIGN KEY, para columnas de vector. La igualdad, la unicidad, las combinaciones que usan columnas vectoriales como claves y los pedidos de ordenación no se aplican a los tipos de datos de vector.
    • No hay ninguna noción de unicidad para los vectores, por lo que las restricciones únicas no son aplicables.
    • La comprobación del intervalo de valores dentro de un vector tampoco es aplicable.
  • Los vectores no admiten la comparación, suma, resta, multiplicación, división, concatenación ni ningún otro operador de asignación matemático, lógico y compuesto.
  • Las columnas de vector no se pueden usar en tablas optimizadas para memoria.
  • No se permite modificar columnas de vector mediante ALTER TABLE ... ALTER COLUMN a otros tipos de datos.

Metadatos del esquema de tabla

  • El procedimiento almacenado del sistema sp_describe_first_result_set no devuelve correctamente el tipo de datos vector. Por lo tanto, muchos clientes y controladores de acceso a datos ven un tipo de datos varchar o nvarchar.

  • INFORMATION_SCHEMA.COLUMNS notifica columnas que usan el tipo vector como varbinary. Una solución alternativa para obtener el tipo de datos correcto es usar la vista del sistema sys.columns.

  • sys.columns devuelve la longitud del vector en bytes. Para obtener el número de dimensiones, use la fórmula siguiente:

    dimensions = (length - 8) / 4
    

    donde length es el valor devuelto por max_length. Por ejemplo, si ve un max_length de 20 bytes, el número de dimensiones es (20 - 8) / 4 = 3.

Conversiones

  • La conversión implícita y explícita mediante CAST o CONVERT del tipo vector se puede realizar para los tipos varchar y nvarchar. De forma similar, solo se pueden convertir de forma explícita o implícita varchar y nvarchar al tipo vector.

  • El tipo vector no se puede usar con el tipo sql_variant ni asignarse a una variable o columna de sql_variant. Esta restricción es similar a varchar(max), varbinary(max), nvarchar(max), xml, json y tipos de datos basados en CLR.

  • Todavía no se admite la conversión a y desde el tipo de datos JSON. La solución consiste en convertir primero desde o a nvarchar(max) y, a continuación, a/desde JSON. Por ejemplo, para convertir un vector en un tipo JSON:

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

    y para convertir de 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;
    

Índices

  • No se permiten índices de árbol B ni índices de almacén de columnas en columnas de vector. Sin embargo, una columna de vector se puede especificar como una columna incluida en una definición de índice.

Tipos definidos por el usuario

  • No se permite la creación de tipo de alias mediante CREATE TYPE para el tipo de vector, similar al comportamiento de los tipos de datos xml y json.

Tablas de libro de contabilidad

  • El procedimiento almacenado sp_verify_database_ledger generará un error si la base de datos contiene una tabla con una columna de vector.

Problemas conocidos

En la versión preliminar en curso hay los siguientes problemas conocidos:

  • Es posible que herramientas como SQL Server Management Studio, Azure Data Studio o la extensión mssql para VS Code no puedan generar actualmente el script de una tabla que tiene una columna con el tipo de datos vector.
  • Herramientas como SQL Server Management Studio, Azure Data Studio o la extensión mssql para VS Code actualmente podrían notificar un tipo de datos de varbinary en lugar de vector para una columna mediante el tipo de vector.
  • BCP y BULK INSERT no funcionan actualmente si las tablas contienen el tipo de vector.
  • Importar y exportar a través de DacFx actualmente no funciona si hay una tabla que usa el tipovector.
  • Actualmente, el cifrado de columnas no admite el tipo de vector.
  • Always Encrypted no admite actualmente el tipo de vector.
  • El enmascaramiento de datos muestra actualmente datos de vector como tipo de datos varbinary en el portal.

Estos problemas se corregirán en futuras actualizaciones y la documentación se actualizará en consecuencia.