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


Тип векторных данных

Применимо к: Sql Server 2025 (17.x) База данныхSQL Azure Управляемого экземпляраSQL Azure в Microsoft Fabric

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

Чтобы предоставить знакомый интерфейс для разработчиков, тип векторных данных создается и отображается в виде массива JSON. Например, вектор с тремя измерениями можно представить как '[0.1, 2, 30]'. Неявное и явное преобразование из и в тип вектор можно выполнить с помощью типов varchar, nvarchar и json.

Note

SQL Server 2025 (17.x) поддерживает векторы с половинной точностью (float16). Дополнительные сведения см. в разделе о поддержке чисел с плавающей запятой половинной точности в векторном типе данных.

float16 Vector в настоящее время доступен для предварительного просмотра. Чтобы проверить, включите PREVIEW_FEATURES параметр конфигурации базы данных с областью действия. Чтобы получить дополнительные сведения, см. PREVIEW_FEATURES = { ON | OFF }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Сведения об ограничениях см. в разделе "Ограничения" и "Известные проблемы".

Note

Функции векторов доступны в Управляемом экземпляре SQL Azure, настроенные с помощью политики [Always-up-to-date](/azure/azure-sql/managed-instance/update-policy#always-up-to-date-update-policy).

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

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

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

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

По умолчанию базовый тип float32. Чтобы использовать половинную точность, необходимо явно указать float16 .

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

Dimensions

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

Examples

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

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

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

Можно определить векторный столбец в таблице с помощью базового типа по умолчанию (float32) или явно указать float16 для хранилища половинной точности.

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

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

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

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

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

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

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

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

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

Поддержка float16 векторов в настоящее время ограничена в PREVIEW_FEATURES конфигурации. Перед использованием VECTOR(..., float16)необходимо явно включить его.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

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

Compatibility

Усовершенствования протокола TDS

SQL Server сохраняет векторы в оптимизированном двоичном формате, но предоставляет их в виде массивов JSON для удобства.

Поддерживаемые драйверы используют усовершенствования протокола TDS для более эффективной передачи векторных данных в двоичном формате и представления их приложениям в качестве собственных типов векторов. Этот подход снижает размер полезных данных, устраняет затраты на анализ JSON и сохраняет полную точность с плавающей запятой. В результате это повышает производительность и точность при работе с высокомерными векторами в сценариях искусственного интеллекта и машинного обучения.

Note

float16 В настоящее время векторы передаются как varchar(max) (массив JSON) через TDS. Поддержка двоичного транспорта для float16 пока недоступна в таких драйверах, как ODBC, JDBC и .NET.

Поддержка собственного драйвера

Приложения, использующие TDS версии 7.4 или выше и обновленные драйверы, могут нативно считывать, записывать, стримить и массово копировать векторные данные.

Для этих возможностей требуются версии следующих драйверов. Убедитесь, что вы используете правильную версию для включения поддержки собственных векторов.

  • Microsoft.Data.SqlClient: версия 6.1.0 представляет тип , который расширяет .
  • Microsoft JDBC Driver for SQL Server: версия 13.1.0 Preview представляет microsoft.sql.Types.VECTOR тип и microsoft.sql.Vector класс.

Note

Для клиентов, не поддерживающих обновленный протокол TDS, SQL Server продолжает предоставлять векторные данные как типы varchar(max), чтобы обеспечить обратную совместимость. Клиентские приложения могут работать с векторными данными, как если бы это был массив JSON. Ядро СУБД SQL автоматически преобразует векторы в массив JSON и из нее, что делает новый тип прозрачным для клиента. Поэтому драйверы и все языки автоматически совместимы с новым типом.

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

Important

Требуется Microsoft.Data.SqlClient 6.1.0 или более поздней версии для поддержки собственных векторов.

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

Если вы не используете последние драйверы .NET, вы по-прежнему можете работать с векторными данными в C# путем сериализации и десериализации его в виде строки JSON с помощью JsonSerializer класса. Это обеспечивает совместимость с varchar(max) представлением векторов, предоставляемых SQL Server для старых клиентов.

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

Следующие средства поддерживают тип векторных данных:

Limitations

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

Tables

  • Ограничения на уровне столбцов не поддерживаются, за исключением NULL/NOT NULL ограничений.

    • DEFAULT и CHECK ограничения не поддерживаются для векторных столбцов.

    • Ограничения ключей, такие как PRIMARY KEY или FOREIGN KEY, не поддерживаются для векторных столбцов. Равенство, уникальность, соединения с использованием векторных столбцов в качестве ключей и порядок сортировки не применяются к типам векторных данных.

    • Нет понятия уникальности для векторов, поэтому уникальные ограничения не применимы.

    • Проверка диапазона значений в векторе также неприменима.

  • Векторы не поддерживают сравнение, добавление, вычитание, умножение, деление, объединение или другие математические, логические и составные операторы назначения.

  • Векторные столбцы нельзя использовать в таблицах, оптимизированных для памяти.

Indexes

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

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

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

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

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

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

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

Всегда зашифровано

  • Тип vector не поддерживается функцией Always Encrypted.

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

  • Маскирование данных в настоящее время отображает векторные данные в качестве типа данных varbinary на портале Azure.