Tipo de dados vetoriais (visualização)
Aplica-se a:Banco de Dados SQL do Azure
Banco 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
O tipo vetorial
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
eCHECK
não são suportadas para colunas vetoriais de. - Não há suporte para restrições impostas por chave, como
PRIMARY KEY
ouFOREIGN 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.
- As restrições
- 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 sistemasys.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 pormax_length
. Por exemplo, se vir umamax_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 varchare 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 colunasql_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 ejson .
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
eDATALENGTH
, 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.