Tipo de dados de vetor (versão prévia)

Aplica-se a: Banco de Dados SQL do Azure

O tipo de dados de vetor foi criado para armazenar dados de vetor otimizados para operações como a pesquisa de similaridade e aplicativos de aprendizado de máquina. Os vetores são armazenados em um formato binário otimizado, mas são expostos como matrizes JSON para conveniência. Cada elemento do vetor é armazenado como um valor de ponto flutuante com precisão única (4 bytes).

Observação

Esse tipo de dados está em versão prévia e está sujeito a alterações. Não deixe de ler os termos de uso da versão prévia no documento SLA (Contratos de Nível de Serviço) para serviços online. Para obter as limitações da versão prévia em dia, consulte Limitações e Problemas conhecidos.

Para obter mais informações sobre como trabalhar com dados do Vector no Banco de Dados SQL, consulte:

Sintaxe de exemplo

A sintaxe de uso para o tipo de vetor é semelhante a todos os outros tipos de dados do SQL Server em uma tabela.

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

Dimensões

Um vetor deve ter pelo menos uma dimensão. O número máximo de dimensões com suporte é 1998.

Exemplos

R. Definição de coluna

O tipo de vetor pode ser usado na definição de coluna contida em uma instrução CREATE TABLE, por exemplo:

O exemplo a seguir cria uma tabela com uma coluna de vetor e insere dados nela.

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 em variáveis

O exemplo a seguir declara vetores usando o novo tipo de dados de vetor e calcula distâncias usando a função VECTOR_DISTANCE.

O tipo de vetor pode ser usado com variáveis:

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

C. Uso em funções ou procedimentos armazenados

O tipo de dados de vetor pode ser usado como parâmetro em funções ou procedimentos armazenados. Por exemplo:

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

Disponibilidade de recursos

O suporte nativo para vetores está atualmente em versão prévia no Banco de Dados SQL do Azure.

O novo tipo de vetor está disponível em todos os níveis de compatibilidade do banco de dados.

Compatibilidade

Para permitir que todos os clientes possam operar em dados de vetor, os vetores são expostos como tipos varchar(max). Os aplicativos cliente podem trabalhar com dados de vetor como se fosse uma Matriz JSON. O mecanismo converterá automaticamente vetores de e para uma matriz JSON, tornando o novo tipo transparente para o cliente. Graças a essa abordagem, todos os drivers e todos os idiomas são automaticamente compatíveis com o novo tipo.

Você pode começar a usar o novo tipo de vetor imediatamente. Veja alguns exemplos:

Com C#, os vetores podem ser serializados e desserializados de e para cadeia de caracteres usando a 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));          
    }
}

Limitações

A versão prévia em andamento tem as seguintes limitações:

Tabelas

  • Não há suporte para restrições no nível de coluna, exceto para restrições NULL/NOT NULL.
    • As restrições DEFAULT e CHECK não têm suporte para colunas de vetor.
    • Restrições de chave, como PRIMARY KEY ou FOREIGN KEY, não têm suporte para colunas de vetor. Igualdade, exclusividade, junções usando colunas de vetor como chaves e ordens de classificação não se aplicam aos tipos de dados de vetor.
    • Vetores não possuem noção de exclusividade, portanto, restrições exclusivas não são aplicáveis.
    • A verificação do intervalo de valores em um vetor também não é aplicável.
  • Os vetores não dão suporte a comparação, adição, subtração, multiplicação, divisão, concatenação ou outros operadores de atribuição matemática, lógica e composta.
  • Colunas de vetor não podem ser usadas em tabelas com otimização de memória.
  • Não é permitido alterar colunas de vetor usando ALTER TABLE ... ALTER COLUMN outros tipos de dados.

Metadados de esquema de tabela

  • O procedimento armazenado do sistema sp_describe_first_result_set não retorna corretamente o tipo de dados de vetor. Portanto, muitos clientes de acesso a dados e driver exibem um tipo de dados varchar ou nvarchar.

  • INFORMATION_SCHEMA.COLUMNS relata colunas usando o tipo de vetor como varbinary. Uma solução alternativa para obter o tipo de dados correto é usar a exibição do sistema sys.columns.

  • sys.columns retorna o comprimento do vetor em bytes. Para obter o número de dimensões, use a seguinte fórmula:

    dimensions = (length - 8) / 4
    

    onde length é o valor retornado por max_length. Por exemplo, se você observar um max_length de 20 bytes, o número de dimensões será (20 - 8) / 4 = 3.

Conversões

  • A conversão implícita e explícita usando CAST ou CONVERT do tipo vetor pode ser feita em tipos de similaridade varchar e nvarchar, somente varchar e nvarchar podem ser convertidos implicitamente ou explicitamente no tipo de vetor.

  • O tipo de vetor não pode ser usado com o tipo sql_variant ou atribuído a uma variável ou coluna de sql_variant. Essa restrição semelhante a varchar(max), varbinary(max), nvarchar(max), xml, json e tipos de dados baseados em CLR.

  • Ainda não há suporte para a conversão de e para o tipo de dados JSON. A solução alternativa é converter primeiro de/para nvarchar(max) e, em seguida, JSON. Por exemplo, para converter um vetor em um tipo JSON:

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

    e para converter de um tipo JSON em vetor:

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

Índices

  • Índices de árvore B ou índices columnstore não são permitidos em colunas de vetor. No entanto, uma coluna de vetor pode ser especificada como uma coluna incluída em uma definição de índice.

Tipos definidos pelo usuário

  • A criação do tipo de alias usando CREATE TYPE para o tipo de vetor não é permitida, semelhante ao comportamento dos tipos de dados xml e json.

Tabelas do razão

  • O procedimento armazenado sp_verify_database_ledger gerará um erro se o banco de dados contiver uma tabela com uma coluna de vetor.

Problemas conhecidos

Na versão prévia em andamento, há os seguintes problemas conhecidos:

  • Ferramentas como o SQL Server Management Studio, o Azure Data Studio ou a extensão mssql para VS Code atualmente podem não conseguir gerar o script de uma tabela que tem uma coluna usando o tipo de dados de vetor.
  • Ferramentas como o SQL Server Management Studio, o Azure Data Studio ou a extensão mssql para VS Code atualmente podem relatar um tipo de dados de varbinary em vez de vetor para uma coluna usando o tipo de vetor.
  • BCP e BULK INSERT atualmente não funcionam se as tabelas contiverem o tipo de vetor.
  • Importar e exportar via DacFx atualmente não funcionará se houver uma tabela usando o tipo de vetor.
  • No momento, a criptografia de coluna não dá suporte ao tipo de vetor.
  • No momento, o Always Encrypted não dá suporte ao tipo de vetor.
  • O mascaramento de dados atualmente mostra dados de vetor como tipo de dados varbinary no portal.

Esses problemas serão corrigidos nas próximas atualizações e a documentação será atualizada adequadamente.