Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к: 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
Следующие средства поддерживают тип векторных данных:
- SQL Server Management Studio версии 21 и более поздних версий
- DacFX и SqlPackage версии 162.5 (ноябрь 2024) и более поздние версии
- Расширение SQL Server для Visual Studio Code версии 1.32 (май 2025 г.) и более поздних версий
- Microsoft.Build.Sql версии 1.0.0 (март 2025 г.) и более поздних версий
- SQL Server Data Tools (Visual Studio 2022) версии 17.13 и более поздних версий
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.
Связанный контент
- Поддержка чисел с плавающей запятой половинной точности в векторном типе данных
- Векторный поиск и векторные индексы в ядро СУБД SQL
- Интеллектуальные приложения
- Векторные функции