适用于:SQL Server 2025 (17.x) 预览版
从 SQL Server 2025 (17.x) 预览版开始,可以为 矢量 数据类型指定基础基类型。 默认情况下, 向量 用作 float32 其基类型。
float16(半精度)是一种在精度降低可以接受时使用的替代类型。 它通过减少存储和提高性能来提供更紧凑的选择。
半精度浮点向量是数字的数组或集合,其中每个数字都使用 16 位半精度 (float16) 浮点格式表示。 此表示形式消耗标准 32 位单精度浮点数的一半内存。 使用这些矢量类型,通过权衡一些精度来节省内存和带宽,特别是在深度学习和矢量数据库中,以提高效率。
虽然 float16 具有显著的存储和性能优势,但与 float32 相比,它提供的数值精度较低。 这种权衡使它非常适合近似相似性方案,例如语义搜索,但不太适合需要高精度算术或精确数字保真度的工作负荷。
float16 支持的主要优势
增加维度支持
SQL Server 支持的向量在使用时最多可达到
1998 × 2(float16)。 此功能使针对float32的 1,998 个维度限制加倍。 例如,此功能可实现更具表现力的嵌入,并与较大模型的text-embedding-large兼容。减少存储和内存占用
与全精度向量相比,以 16 位格式存储向量会显著减少所需的存储量。 这使得大规模存储和查询高维向量是可行的。 此优化还提高了数据密度,这可以提高矢量搜索方案中的查询性能。
存储效率和精度控制
选择最合适的基类型:
-
float16用于紧凑型存储 -
float32用于常规用途和精度要求更高的任务
这种灵活性可确保最佳的资源使用,而不会影响应用程序的准确性。
-
示例语法
用法语法类似于 矢量 数据类型。 但是,若要使用 float16,请显式指定基类型。
column_name VECTOR(<dimensions> [, <base_type>]) [NOT NULL | NULL]
功能可用性
float16 vector 当前可供预览。 若要测试,请启用 PREVIEW_FEATURES 数据库范围的配置选项。 有关详细信息,请查看 PREVIEW_FEATURES = { ON |OFF }。
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO
例子
在语句中使用默认基类型或显式基类型定义向量列。
默认情况下,基类型为 float32.
-- Default: float32
CREATE TABLE ExampleTable
(
id INT PRIMARY KEY,
VectorColumn VECTOR (3)
);
若要使用 半精度,请显式指定 float16 。
-- Explicit float16
CREATE TABLE ExampleTable (
id INT PRIMARY KEY,
VectorColumn VECTOR(3, float16)
);
以下示例创建一个具有半精度浮向量列的表,并将数据插入其中。
-- Step 0: Enable Preview Features
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
-- Step 1: Create a Table with a VECTOR(5, float16) Column
CREATE TABLE dbo.Articles
(
id INT PRIMARY KEY,
title NVARCHAR(100),
content NVARCHAR(MAX),
embedding VECTOR(5, float16)
);
-- Step 2: Insert Sample Data
INSERT INTO Articles (id, title, content, embedding)
VALUES
(1, 'Intro to AI', 'This article introduces AI concepts.', '[0.1, 0.2, 0.3, 0.4, 0.5]'),
(2, 'Deep Learning', 'Deep learning is a subset of ML.', '[0.2, 0.1, 0.4, 0.3, 0.6]'),
(3, 'Neural Networks', 'Neural networks are powerful models.', '[0.3, 0.3, 0.2, 0.5, 0.1]'),
(4, 'Machine Learning Basics', 'ML basics for beginners.', '[0.4, 0.5, 0.1, 0.2, 0.3]'),
(5, 'Advanced AI', 'Exploring advanced AI techniques.', '[0.5, 0.4, 0.6, 0.1, 0.2]');
-- Step 3: Perform a Vector Similarity Search Using VECTOR_DISTANCE function
DECLARE @v VECTOR(5, float16) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP (3)
id,
title,
VECTOR_DISTANCE('cosine', @v, embedding) AS distance
FROM dbo.Articles
ORDER BY distance;
-- Step 4: Optionally Create a Vector Index
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (
metric = 'cosine',
type = 'diskANN'
);
-- Step 5: Perform a Vector Similarity Search
DECLARE @qv VECTOR(5, float16) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT
t.id,
t.title,
t.content,
s.distance
FROM
VECTOR_SEARCH(
table = Articles AS t,
column = embedding,
similar_to = @qv,
metric = 'cosine',
top_n = 3
) AS s
ORDER BY s.distance, t.title;
检查矢量基类型元数据
以下查询确认 矢量 列的实际基类型和维度:
--Inspect Vector Base type Metadata in sys.columns
SELECT name AS column_name,
system_type_id,
user_type_id,
vector_dimensions,
vector_base_type,
vector_base_type_desc
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.Articles');
输出列:
vector_dimensions:为向量定义的维度数。vector_base_type:基类型的内部数值代码:0=float321=float16
vector_base_type_desc:基类型的人类可读说明。
支持的隐式和显式转换
SQL Server 支持从 varchar、nvarchar 和 json 字符串到向量的隐式和显式转换,只要向量声明了明确的维度计数。
DECLARE @j JSON = '[1.0, 2.0, 3.0]';
DECLARE @v VECTOR(3, float16);
SET @v = CAST(@j AS VECTOR(3, float16)); -- Explicit conversion from JSON to float16
DECLARE @v1 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = CAST(@v1 AS VECTOR(3, float16)); -- Explicit conversion from VARCHAR to float16
DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = CAST(@v1 AS VECTOR(3, float16)); -- Explicit conversion from NVARCHAR to float16
仅当完全声明目标 向量 类型时,才支持隐式转换。
-- Implicit conversion from VARCHAR to float16
DECLARE @v1 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1;
-- Implicit conversion from NVARCHAR to float16
DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1
--From JSON_ARRAY to VECTOR
DECLARE @v3 VECTOR(3, float16) = JSON_ARRAY(1.0, 2.0, 3.0);
不受支持的或容易出错的方案
以下示例突出显示了在 SQL Server 中使用半精度浮 向量 数据类型时的常见错误和限制。
基类型 float32 和 float16 之间的显式和隐式转换
SQL Server 目前不支持VECTOR(float32)和VECTOR(float16)之间的隐式转换。
此外,当前使用或CAST进行的CONVERT被阻止。
DECLARE @v1 VECTOR(3, float16);
DECLARE @v2 VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
SET @v1 = CAST(@v2 AS VECTOR(3, float16)); -- Explicit conversion from float32 to float16
-- ❌ Error: Msg 42238, Level 16, State 1, Line 61
Conversion of vector from data type float32 to float16 is not allowed.
维度不匹配
不允许在具有不匹配维度的向量之间进行转换,并引发维度不匹配错误。
DECLARE @v1 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(4, float16) = NULL;
SET @v1 = @v2;
-- Error: Msg 42204, Level 16, State 1, Line 10
The vector dimensions 4 and 3 do not match
空值处理
如果向量在没有维度计数的情况下声明,则为其分配值会引发错误。
DECLARE @v1 VECTOR(3, float16) = NULL;
DECLARE @v2 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2; -- This works
--However, if the dimension count is not specified, it raises an error
DECLARE @v1 VECTOR(float16) = NULL;
DECLARE @v2 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;
范围外值
超出 float16 范围的值(例如超过 65504.0)在分配时会引发错误。
DECLARE @v VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
-- Error: Input JSON contains out-of-range values for float16
函数中的混合基类型
函数 VECTOR_DISTANCE 中的混合基类型不受支持,并引发类型错误。
DECLARE @v1 VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: VECTOR_DISTANCE does not support different base types
不支持的体系结构
float16 Arm64 体系结构不支持,并且使用它会引发运行时错误
DECLARE @v1 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, int) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: float16 is not supported on ARM64 architecture
SIMD 溢出
基于 SIMD 的操作(例如 AVX2、SSE4.2)如果值超出可表示的范围,可能会产生溢出错误。
DECLARE @v AS VECTOR (8) = '[-2.9e+38, ..., 2.9e+38]';
SELECT VECTOR_NORM(@v, 'norm1');
-- Behavior depends on ARITHABORT setting:
-- ARITHABORT ON → Error
-- ARITHABORT OFF → NULL
工具支持
SQL Server Management Studio (SSMS)目前在用户界面中不区分 float32 和 float16。 使用sys.columns确认架构中使用的实际基类型。
二进制传输支持对于 float16 向量尚未可用。
float16 矢量当前通过 TDS 作为 varchar(max) (JSON 数组)传输。 ODBC、JDBC 和 .NET 等驱动程序中尚不支持 float16 的二进制传输。
注释
适用于默认 向量 类型的所有限制(with float32) 也适用 VECTOR(float16)。