Тип векторных данных (предварительная версия)
применимо к:базе данных 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 на портале.
- При передаче типа вектора
DATALENGTH
1 функции datalength) возвращается. - В некоторых случаях при передаче вектора в хранимую процедуру или функцию может возникнуть ошибка 42211 (усечение вектора запрещено во время преобразования). Обходной путь — использовать вместо этого тип вектора nvarchar(max).
Эти проблемы будут исправлены в будущих обновлениях и документации будут обновлены соответствующим образом.