You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Microsoft SQL Server中存储n维向量?

在SQL Server中存储n维嵌入向量的优化方案

针对你提到的384维嵌入向量存储需求,结合你已尝试的三种方案的局限,下面给出几个更优的实践方向:

1. 优先选用SQL Server 2022+/Azure SQL的原生向量支持

如果你的环境是SQL Server 2022及以上版本,或是Azure SQL Database,直接用官方原生的向量存储功能是最优解:

  • 用VECTOR数据类型(基于FLOAT数组)直接存储n维向量,无需手动拆分或打包,结构简洁易维护。
  • 内置VECTOR_DISTANCE函数,指定EUCLIDEAN参数即可直接计算欧氏距离,性能经过官方优化,远优于自定义实现。
  • 示例表结构:
    CREATE TABLE EmbeddedData (
        Id INT PRIMARY KEY,
        EntityId INT REFERENCES YourMainTable(Id),
        Embedding VECTOR(384) NOT NULL
    );
    
  • 欧氏距离计算示例:
    SELECT 
        Id,
        VECTOR_DISTANCE(Embedding, @queryVector, 'EUCLIDEAN') AS EuclideanDistance
    FROM EmbeddedData
    ORDER BY EuclideanDistance;
    

该方案完全规避了手动处理向量的繁琐,还支持后续创建向量索引加速相似度查询。

2. 旧版本SQL Server:VARBINARY+CLR函数组合

如果你的SQL Server版本低于2022,推荐优化你之前尝试的二进制打包方案:

  • 用VARBINARY(MAX)存储序列化后的向量(优先用Protocol Buffers或Span序列化替代低效的BinaryFormatter,减少存储空间和解析耗时)。
  • 编写.NET CLR标量函数实现向量解析与欧氏距离计算,性能比纯T-SQL实现高一个量级。
  • 注意:需要开启SQL Server的CLR集成权限,且函数需做性能测试避免内存泄漏。
  • 简化版CLR函数逻辑:
    [SqlFunction(DataAccess = DataAccessKind.None)]
    public static double CalculateEuclideanDistance(SqlBinary vec1, SqlBinary vec2)
    {
        float[] vector1 = DeserializeVector(vec1.Value);
        float[] vector2 = DeserializeVector(vec2.Value);
        double sum = 0;
        for (int i = 0; i < vector1.Length; i++)
        {
            sum += Math.Pow(vector1[i] - vector2[i], 2);
        }
        return Math.Sqrt(sum);
    }
    

注册CLR函数后,即可在T-SQL中直接调用计算距离。

3. 空间类型的适用性说明

直接结论:空间类型(GEOMETRY/GEOGRAPHY)不适合存储高维向量。这类类型专为2D/3D地理/几何空间设计,最多支持Z(海拔)、M(度量)两个额外维度,完全无法适配384维的嵌入向量,无需考虑该方向。

4. 批量计算场景:列式存储优化多列方案

如果你需要频繁做批量向量相似度计算,且不想依赖CLR,可以优化之前的多列存储方案:

  • 将384个维度列定义为FLOAT类型,存入列式存储表(或给普通表添加列式存储索引)。
  • 列式存储针对批量扫描和聚合计算做了优化,SUM+POWER的欧氏距离计算会比行存储快很多。
  • 用动态SQL生成计算语句,避免手动编写384个列的表达式:
    DECLARE @queryVector NVARCHAR(MAX) = '[0.1,0.2,...,0.384]'; -- 示例查询向量JSON
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = 'SELECT Id, SQRT(' + STRING_AGG('POWER(Col' + CAST(n AS NVARCHAR) + ' - JSON_VALUE(@queryVector, ''$[' + CAST(n-1 AS NVARCHAR) + ']''), 2)', ' + ') + ') AS EuclideanDistance FROM EmbeddedColumns ORDER BY EuclideanDistance';
    EXEC sp_executesql @sql, N'@queryVector NVARCHAR(MAX)', @queryVector;
    

该方案的缺点是列数多、维护繁琐,但胜在无需额外开发,适合旧版本且对批量性能有要求的场景。


内容的提问来源于stack exchange,提问作者Ian Boyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:55:36