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

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

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

Чтобы предоставить знакомый интерфейс для разработчиков, тип векторных данных создается и отображается в виде массива JSON. Например, вектор с тремя измерениями можно представить как '[0.1, 2, 30]'. Преобразование между типом вектора и типами char, nchar, varchar, nvarchar и json может быть как неявным, так и явным в обоих направлениях. Преобразование между vector и всеми другими типами данных запрещено. Преобразование между двумя значениями векторов возможно только тогда, когда размеры и базовый тип (float32 или float16) совпадают; в противном случае возникает ошибка 42204 или 42238.

Когда вы преобразуете строку или значение json в вектор, значение должно быть JSON-массивом чисел. Количество элементов должно быть равно размерности вектора; в противном случае возникает ошибка 42204. Другие значения вызывают ошибку 13670. Белое пространство до и после массива игнорируется.

При преобразовании vector в тип строки результат использует научную нотацию, например [1.0000000e+000,2.5000000e+000,-3.0000000e+000]. При преобразовании vector в json результат использует десятичную нотацию, например [1.0000000000,2.5000000000,-3.0000000000]. Если целевая длина слишком коротка, возникает ошибка 42211. Значение не усекается.

vector имеет меньший приоритет, чем типы строк. В UNION, CASE, COALESCEи других выражениях, объединяющих вектор с типом строки, результатом является тип строки.

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

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

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

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

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

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

Dimensions

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

  • float32 поддерживает до 1 998 измерений.
  • float16 поддерживает до 3 996 измерений.

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

Векторный тип данных доступен на всех уровнях совместимости баз данных. Если вы не указываете тип базы, вектор использует float32.

Функции векторов доступны в Управляемом экземпляре SQL Azure, настроенном с помощью политики Always-up-to-date .

Векторы половинной точности (float16)

  • Векторы с половинной точностью (float16) обычно доступны в База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric. Конфигурация предварительного просмотра не требуется.

  • В SQL Server 2025 (17.x) доступны векторы полуточности (float16) в предварительном просмотре. Чтобы использовать float16 в SQL Server 2025, необходимо включить PREVIEW_FEATURES опцию конфигурации с областью действия базы данных. Для получения дополнительной информации см. раздел «Включить функции предварительного просмотра в SQL Server 2025».

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

Включите функции предварительного просмотра в SQL Server 2025

Для некоторых предварительных возможностей в SQL Server 2025 необходимо включить параметр конфигурации области базы данных PREVIEW_FEATURES.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Для получения дополнительной информации см. PREVIEW_FEATURES.

Examples

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

Используйте тип vector в определениях столбцов в инструкции 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_fp16
(
    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;
GO

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

Conversions

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

Compatibility

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

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

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

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

Приложения, использующие 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

Нативный двоичный транспорт для векторов float16 поддерживается в Microsoft JDBC Driver 13.4 для SQL Server и Microsoft ODBC Driver 18.7.1 для SQL Server. Эти драйверы сериализуют и десериализуют значения векторов с половинной точностью, используя собственный формат передачи по сети, что уменьшает объём передаваемых данных по сравнению с JSON-представлением. Используйте эти или более поздние версии драйверов для нативной поддержки передачи float16. Драйверы, не поддерживающие нативный транспорт float16 , могут продолжать работать с векторами, представленными в varchar(max) виде JSON-массивов.

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 на векторных столбцах. Однако вы можете включить векторный столбец как включённый столбец в определение индекса.
  • Векторные индексы создают приблизительный индекс на векторном столбце для повышения эффективности поиска ближайших соседей. Чтобы узнать больше о том, как работает векторное индексирование и векторный поиск, а также о различиях между точным и приблизительным поиском, см. раздел векторный поиск и векторные индексы в SQL ядро СУБД.

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

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

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

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

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

  • Вы не можете создать тип псевдонима, используя CREATE TYPEвекторный тип. Это ограничение похоже на поведение типов данных xml и json .

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

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

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

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