Partilhar via


Tipo de dados vetoriais

Aplica-se a: SQL Server 2025 (17.x) Azure SQL Database AzureSQL Managed InstanceSQL database in 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).

Para fornecer uma experiência familiar para os desenvolvedores, o tipo de dados vetoriais é criado e exibido como uma matriz JSON. Por exemplo, um vetor com três dimensões pode ser representado como '[0.1, 2, 30]'. A conversão implícita e explícita de e para o tipo vetorial pode ser feita usando tipos varchar, nvarchar e json .

Note

O SQL Server 2025 (17.x) suporta vetores de meia-precisão (float16). Para mais informações, veja Suporte a float de meia precisão no tipo de dado vetorial.

float16 Vetor está atualmente disponível para visualização. Para testar, habilite a opção de configuração do escopo do PREVIEW_FEATURES banco de dados. Para obter detalhes, revise PREVIEW_FEATURES = { ON | DESLIGADO }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Para ver as limitações, consulte Limitações e Problemas conhecidos.

Note

As funcionalidades vetoriais estão disponíveis no Azure SQL Managed Instance configurado com a política [Always-up-to-date](/azure/azure-sql/managed-instance/ update-policy#always-up-to-date-update-policy).

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 ]

Por padrão, o tipo base é float32. Para usar meia precisão, é preciso especificar float16 explicitamente.

column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]

Dimensions

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

Examples

A. 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.

Pode definir uma coluna vetorial numa tabela usando o tipo base padrão (float32) ou especificar float16 explicitamente para armazenamento de meia precisão.

CREATE TABLE dbo.vectors
(
    id INT PRIMARY KEY,
    v VECTOR(3) NOT NULL -- Uses default base type (`float32`)
);

CREATE TABLE dbo.vectors
(
    id INT PRIMARY KEY,
    v VECTOR(3, float16) -- Uses float16 for reduced storage and precision
);

INSERT INTO dbo.vectors (id, v)
VALUES (1, '[0.1, 2, 30]'),
       (2, '[-100.2, 0.123, 9.876]'),
       (3, JSON_ARRAY(1.0, 2.0, 3.0)); -- Using JSON_ARRAY to create a vector

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 AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
DECLARE @v AS VECTOR(3, float16) = '[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.

O suporte para float16 vetores está atualmente fechado sob a PREVIEW_FEATURES configuração. Você deve ativá-lo explicitamente antes de usar VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • 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 aos tipos de dados baseados em varchar(max),varbinary(max), nvarchar(max), xml, json e CLR.

Compatibility

Melhorias ao protocolo TDS

O SQL Server armazena vetores em um formato binário otimizado, mas os expõe como matrizes JSON por conveniência.

Os drivers suportados usam aprimoramentos no protocolo TDS para transmitir dados vetoriais de forma mais eficiente em formato binário e apresentá-los aos aplicativos como tipos de vetores nativos. Essa abordagem reduz o tamanho da carga útil, elimina a sobrecarga da análise JSON e preserva a precisão total do ponto flutuante. Como resultado, melhora o desempenho e a precisão ao trabalhar com vetores de alta dimensão em cenários de IA e aprendizado de máquina.

Note

float16 vetores são atualmente transmitidos como varchar(max) (matriz JSON) através de TDS. O suporte de transporte binário para float16 ainda não está disponível em drivers como ODBC, JDBC e .NET.

Suporte de drivers nativos

Os aplicativos que usam TDS versão 7.4 ou superior e drivers atualizados podem ler, gravar, transmitir e copiar dados vetoriais nativamente.

Estas capacidades requerem versões dos seguintes drivers. Certifique-se de que está a utilizar a versão correta para ativar o suporte vetorial nativo.

  • Microsoft.Data.SqlClient: Versão 6.1.0 introduz o SqlVector tipo, estendendo System.Data.SqlDbTypes.
  • Microsoft JDBC Driver for SQL Server: Versão 13.1.0 Preview apresenta o microsoft.sql.Types.VECTOR tipo e a microsoft.sql.Vector classe.

Note

Para clientes que não oferecem suporte ao protocolo TDS atualizado, o SQL Server continua a expor dados vetoriais como tipos varchar(max) para garantir a compatibilidade com versões anteriores. Os aplicativos cliente podem trabalhar com dados vetoriais como se fossem uma matriz JSON. O Mecanismo de Banco de Dados SQL converte automaticamente vetores de e para uma matriz JSON, tornando o novo tipo transparente para o cliente. Assim, 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. Os exemplos a seguir mostram diferentes idiomas e configurações de driver.

Important

Requer Microsoft.Data.SqlClient 6.1.0 ou posterior para suporte vetorial nativo.

using Microsoft.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlTypes;

namespace VectorSampleApp
{
    class Program
    {
        // Set your environment variable or fallback to local server
        private static readonly string connectionString =
            Environment.GetEnvironmentVariable("CONNECTION_STR")
            ?? "Server=tcp:localhost,1433;Database=Demo2;Integrated Security=True;TrustServerCertificate=True";

        private const int VectorDimensions = 3;
        private const string TableName = "dbo.Vectors";

        static void Main()
        {
            using var connection = new SqlConnection(connectionString);
            connection.Open();
            SetupTables(connection, TableName, VectorDimensions);
            InsertVectorData(connection, TableName);
            ReadVectorData(connection, TableName);
        }

        private static void SetupTables(SqlConnection connection, string tableName, int vectorDimensionCount)
        {
            using var command = connection.CreateCommand();

            command.CommandText = $@"
                IF OBJECT_ID('{tableName}', 'U') IS NOT NULL DROP TABLE {tableName};
                IF OBJECT_ID('{tableName}Copy', 'U') IS NOT NULL DROP TABLE {tableName}Copy;";
            command.ExecuteNonQuery();

            command.CommandText = $@"
                CREATE TABLE {tableName} (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );

                CREATE TABLE {tableName}Copy (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );";
            command.ExecuteNonQuery();
        }

        private static void InsertVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"INSERT INTO {tableName} (VectorData) VALUES (@VectorData)", connection);
            var param = command.Parameters.Add("@VectorData", SqlDbTypeExtensions.Vector);

            // Insert null using DBNull.Value
            param.Value = DBNull.Value;
            command.ExecuteNonQuery();

            // Insert non-null vector
            param.Value = new SqlVector<float>(new float[] { 3.14159f, 1.61803f, 1.41421f });
            command.ExecuteNonQuery();

            // Insert typed null vector
            param.Value = SqlVector<float>.CreateNull(VectorDimensions);
            command.ExecuteNonQuery();

            // Prepare once and reuse for loop
            command.Prepare();
            for (int i = 0; i < 10; i++)
            {
                param.Value = new SqlVector<float>(new float[]
                {
                    i + 0.1f,
                    i + 0.2f,
                    i + 0.3f
                });
                command.ExecuteNonQuery();
            }
        }

        private static void ReadVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"SELECT VectorData FROM {tableName}", connection);
            using var reader = command.ExecuteReader();

            while (reader.Read())
            {
                var sqlVector = reader.GetSqlVector<float>(0);

                Console.WriteLine($"Type: {sqlVector.GetType()}, IsNull: {sqlVector.IsNull}, Length: {sqlVector.Length}");

                if (!sqlVector.IsNull)
                {
                    float[] values = sqlVector.Memory.ToArray();
                    Console.WriteLine("VectorData: " + string.Join(", ", values));
                }
                else
                {
                    Console.WriteLine("VectorData: NULL");
                }
            }
        }
    }
}

Note

Se não estiveres a usar os drivers .NET mais recentes, ainda podes trabalhar com dados vetoriais em C#, serializando e desserializando como uma string JSON usando a JsonSerializer classe. Isso garante a compatibilidade com a varchar(max) representação de vetores expostos pelo SQL Server para clientes mais antigos.

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));
    }
}

Tools

As seguintes ferramentas suportam o tipo de dados vetoriais :

Limitations

O tipo de vetor tem as seguintes limitações:

Tables

  • Não há suporte para restrições no nível da coluna, exceto restrições NULL/NOT NULL .

    • DEFAULT e CHECK não suportam restrições para colunas vetoriais.

    • Restrições de chave, como PRIMARY KEY ou FOREIGN KEY, não são suportadas para colunas vetoriais . Igualdade, exclusividade, junções usando colunas vetoriais como chaves e ordens de classificação não se aplicam a tipos de dados vetoriais .

    • Não há noção de exclusividade 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.

  • As colunas vetoriais não podem ser usadas em tabelas com otimização de memória.

Indexes

  • Índices B-tree ou columnstore não são permitidos em colunas vetoriais. No entanto, um vetor e uma coluna podem ser especificados como uma coluna incluída em uma definição de índice.

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.

Tabelas contábeis

  • O procedimento sp_verify_database_ledger armazenado gera um erro se o banco de dados contiver uma tabela com uma coluna vetorial .

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.

Sempre criptografado

  • o tipo de vetor não é suportado com a funcionalidade Always Encrypted.

Problemas conhecidos

  • Atualmente, o mascaramento de dados mostra dados vetoriais como dados do tipo varbinary no portal do Azure.