Partilhar via


Tipo de dados vetoriais (visualização)

Aplica-se a:Banco de Dados SQL do AzureBanco de Dados SQL no Microsoft Fabric

O tipo de dados vetor foi projetado para armazenar dados de vetor otimizados para operações como pesquisa de semelhança e aplicações de aprendizagem automática. Os vetores são armazenados em um formato binário otimizado, mas são expostos como matrizes JSON por conveniência. Cada elemento do vetor é armazenado como um valor de ponto flutuante de precisão única (4 bytes).

Observação

Este tipo de dados está em pré-visualização e está sujeito a alterações. Certifique-se de ler os termos de utilização em pré-visualização no documento Contratos de Nível de Serviço (SLA) para Serviços Online. Para consultar as limitações da visualização atual, veja Limitações e Problemas conhecidos.

Para obter mais informações sobre como trabalhar com dados vetoriais, consulte:

Sintaxe de exemplo

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

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 suportadas é 1998.

Exemplos

Um. Definição da coluna

O tipo de vetor pode ser usado na definição de coluna contida numa 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 vetor e calcula distâncias usando a função .

O tipo vetorial pode ser usado com variáveis:

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

C. Uso em procedimentos armazenados ou funções

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

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

Disponibilidade de funcionalidades

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

Compatibilidade

Para permitir que todos os clientes operem em dados de vetor, os vetores são expostos como tipos de varchar(max) . Os aplicativos cliente podem trabalhar com dados vetoriais 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 esta 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. Eis alguns exemplos:

Com C#, os vetores podem ser serializados e desserializados para e a partir de uma string 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 pré-visualização em curso tem as seguintes limitações:

Tabelas

  • Não há suporte para restrições de nível de coluna, exceto restrições de NULL/NOT NULL.
    • As restrições DEFAULT e CHECK não são suportadas para colunas vetoriais de.
    • Não há suporte para restrições impostas por chave, como PRIMARY KEY ou FOREIGN KEY, para colunas vetoriais de. Igualdade, exclusividade, junções usando colunas vetoriais como chaves e ordens de classificação não se aplicam a tipos de dados vetorial.
    • Não há noção de unicidade para vetores, portanto, restrições únicas não são aplicáveis.
    • Verificar o intervalo de valores dentro de um vetor também não é aplicável.
  • Os vetores não suportam comparação, adição, subtração, multiplicação, divisão, concatenação ou quaisquer outros operadores de atribuição matemática, lógica e composta.
  • vetor de colunas não pode ser usado em tabelas otimizadas para memória.
  • Não é permitido alterar colunas de vetorial usando ALTER TABLE ... ALTER COLUMN para outros tipos de dados.

Metadados do esquema de tabela

  • sp_describe_first_result_set procedimento armazenado do sistema não retorna corretamente o tipo de dados vetor . Portanto, muitos clientes de acesso a dados e drivers vêem um tipo de dados varchar ou nvarchar.

  • INFORMATION_SCHEMA.COLUMNS relata colunas usando tipo vetor como varbinary. Uma solução alternativa para obter o tipo de dados correto é usar a visã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 vir uma max_length de 20 bytes, o número de dimensões é (20 - 8) / 4 = 3.

Conversões

  • A conversão implícita e explícita usando ou do tipo vetorial pode ser feita para tipos varchar e nvarchar de; da mesma forma, apenas tipos varchar e nvarchar de podem ser implicitamente ou explicitamente convertidos para o tipo vetorial .

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

  • A transmissão de e para o tipo de dados JSON ainda não é suportada. A solução alternativa é primeiro converter de/para nvarchar(max) e depois de/para 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;
    

    para converter de um tipo JSON para um vetor:

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

Índices

  • Os índices de árvore B ou índices de armazém de colunas não são permitidos em colunas de vetor . No entanto, um vetor e uma coluna podem ser especificados como uma coluna incluída em uma definição de índice.

Tipos definidos pelo usuário

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

Tabelas contábeis

  • O procedimento armazenado sp_verify_database_ledger gerará um erro se a base de dados contiver uma tabela com uma coluna vetorial .

Problemas conhecidos

Existem os seguintes problemas conhecidos na pré-visualização em curso:

  • Ferramentas como o SQL Server Management Studio, o Azure Data Studio ou a extensão mssql para VS Code atualmente podem não ser capazes de gerar o script de uma tabela que tenha uma coluna usando o vetor tipo de dados.
  • 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 vector para uma coluna usando o tipo vector.
  • BCP e BULK INSERT não funcionam atualmente se as tabelas contiverem o vetorial do tipo .
  • Importar e exportar via DacFx atualmente não funciona se houver uma tabela usando o tipo vetorial de .
  • Atualmente, a criptografia de coluna não suporta o tipo vetorial .
  • Atualmente, o Always Encrypted não suporta o tipo vetorial.
  • Atualmente, o mascaramento de dados mostra dados de vetorial como tipo de dados varbinary no portal.
  • Ao passar um vetor do tipo para LEN e DATALENGTH, o erro 8116 (O tipo de dados do vetor de argumento é inválido para o argumento 1 da função datalength) é retornado.
  • Em alguns casos, quando você passa um vetor para um procedimento armazenado ou uma função, você, pode obter o erro 42211 (truncamento de vetor não é permitido durante a conversão). Uma solução alternativa é usar nvarchar(max) em vez de vetor do tipo.

Esses problemas serão corrigidos em atualizações futuras e a documentação será atualizada de acordo.