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
yCHECK
para columnas de vector. - No se admiten restricciones de clave, como
PRIMARY KEY
oFOREIGN 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.
- No se admiten restricciones
- 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 sistemasys.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 pormax_length
. Por ejemplo, si ve unmax_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
oCONVERT
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.