Поделиться через


Тип векторных данных (предварительная версия)

применимо к:базе данных SQL Azureбазы данных SQL в Microsoft Fabric

Тип векторных данных предназначен для хранения векторных данных, оптимизированных для операций, таких как поиск сходства и приложения машинного обучения. Векторы хранятся в оптимизированном двоичном формате, но предоставляются в виде массивов JSON для удобства. Каждый элемент вектора хранится в виде значения с плавающей запятой (4-байтов).

Примечание.

Этот тип данных находится в предварительной версии и подлежит изменению. Обязательно ознакомьтесь с условиями использования предварительной версии в документе соглашения об уровне обслуживания (SLA) для веб-служб . Сведения об ограничениях текущей предварительной версии см. в разделе "Ограничения " и "Известные проблемы".

Дополнительные сведения о работе с векторными данными см. в следующем разделе:

Пример синтаксиса

Синтаксис использования для типа вектора аналогичен всем другим типам данных SQL Server в таблице.

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

Измерения

Вектор должен иметь по крайней мере одно измерение. Максимальное число поддерживаемых измерений — 1998.

Примеры

А. Определение столбца

Тип вектора можно использовать в определении столбцов, содержащихся в CREATE TABLE инструкции, например:

В следующем примере создается таблица с векторным столбцом и вставляет в нее данные.

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. Использование в переменных

В следующем примере объявляют векторы с помощью нового типа данных векторов и вычисляют расстояния с помощью VECTOR_DISTANCE функции.

Тип вектора можно использовать с переменными:

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

В. Использование в хранимых процедурах или функциях

Тип векторных данных можно использовать в качестве параметра в хранимой процедуре или функциях. Например:

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

Доступность функций

Новый тип вектора доступен на всех уровнях совместимости базы данных.

Совместимость

Чтобы разрешить всем клиентам работать с векторными данными, векторы предоставляются как типы varchar(max ). Клиентские приложения могут работать с векторными данными, как если бы это был массив JSON. Модуль автоматически преобразует векторы в массив JSON и из нее, что делает новый тип прозрачным для клиента. Благодаря этому подходу все драйверы и все языки автоматически совместимы с новым типом.

Вы можете сразу начать использовать новый тип вектора. Вот некоторые примеры:

С помощью C#векторы можно сериализовать и десериализировать в строку с помощью 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));          
    }
}

Ограничения

Текущая предварительная версия имеет следующие ограничения:

Таблицы

  • Ограничения на уровне столбцов не поддерживаются, за исключением NULL/NOT NULL ограничений.
    • DEFAULT и CHECK ограничения не поддерживаются для векторных столбцов.
    • Ограничения ключей, такие как PRIMARY KEY или FOREIGN KEY, не поддерживаются для векторных столбцов. Равенство, уникальность, соединения с использованием векторных столбцов в качестве ключей и порядок сортировки не применяются к типам векторных данных.
    • Нет понятия уникальности для векторов, поэтому уникальные ограничения не применимы.
    • Проверка диапазона значений в векторе также неприменимо.
  • Векторы не поддерживают сравнение, добавление, вычитание, умножение, деление, объединение или любые другие математические, логические и составные операторы присваивания.
  • векторные столбцы нельзя использовать в таблицах, оптимизированных для памяти.
  • Изменение векторных столбцов, использующих ALTER TABLE ... ALTER COLUMN другие типы данных, запрещено.

Метаданные схемы таблицы

  • sp_describe_first_result_set системная хранимая процедура неправильно возвращает тип векторных данных. Поэтому многие клиенты и драйвер доступа к данным видят тип данных varchar или nvarchar .

  • INFORMATION_SCHEMA.COLUMNS сообщает столбцы, использующие векторный тип в качестве varbinary. Обходной путь для получения правильного типа данных — использовать sys.columns системное представление.

  • sys.columns возвращает длину вектора в байтах. Чтобы получить количество измерений, используйте следующую формулу:

    dimensions = (length - 8) / 4
    

    где length возвращается значение max_length. Например, если вы видите max_length 20 байт, число измерений равно (20 – 8) / 4 = 3.

Преобразования

  • Неявное и явное преобразование с помощью CAST типа вектора CONVERT можно выполнить для varchar, а типы nvarchar аналогично, только varchar и nvarchar могут быть неявно или явно преобразованы в тип вектора.

  • Тип вектора нельзя использовать с типом sql_variant или назначить sql_variant переменной или столбцу. Это ограничение похоже на varchar(max), varbinary(max), nvarchar(max), xml, json и типы данных на основе СРЕДЫ CLR.

  • Приведение к типу данных JSON и из нее еще не поддерживается. Обходной путь — сначала преобразовать из nvarchar(max), а затем в json или из нее. Например, чтобы преобразовать вектор в тип JSON:

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

    и для преобразования из типа JSON в вектор:

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

Индексы

  • Индексы B-дерева или индексы columnstore не допускаются для векторных столбцов. Однако столбец вектора можно указать как включенный столбец в определении индекса.

Определяемые пользователем типы

  • Создание типа псевдонима, используемого CREATE TYPE для типа вектора , не допускается, аналогично поведению типов данных XML и JSON .

Таблицы реестра

  • Хранимая процедура sp_verify_database_ledger создаст ошибку, если база данных содержит таблицу с векторным столбцом.

Известные проблемы

В текущей предварительной версии существуют следующие известные проблемы:

  • Такие средства, как SQL Server Management Studio, Azure Data Studio или расширение mssql для VS Code в настоящее время, могут не создавать скрипт таблицы с столбцом с помощью типа векторных данных.
  • Такие средства, как SQL Server Management Studio, Azure Data Studio или расширение mssql для VS Code, в настоящее время могут сообщать тип данных varbinary вместо вектора для столбца с помощью векторного типа.
  • BCP и BULK INSERT в настоящее время не работают, если таблицы содержат тип вектора.
  • Импорт и экспорт через DacFx в настоящее время не работает, если таблица использует тип вектора .
  • Шифрование столбцов в настоящее время не поддерживает тип вектора.
  • Always Encrypted в настоящее время не поддерживает тип вектора.
  • Маскирование данных в настоящее время отображает векторные данные в виде типа данных varbinary на портале.
  • При передаче типа вектораDATALENGTH1 функции datalength) возвращается.
  • В некоторых случаях при передаче вектора в хранимую процедуру или функцию может возникнуть ошибка 42211 (усечение вектора запрещено во время преобразования). Обходной путь — использовать вместо этого тип вектора nvarchar(max).

Эти проблемы будут исправлены в будущих обновлениях и документации будут обновлены соответствующим образом.