向量資料型態 (預覽)
適用於:Azure SQL 資料庫
向 量 數據類型是設計來儲存針對類似性搜尋和機器學習應用程式等作業優化的向量數據。 向量會以優化的二進位格式儲存,但為了方便起見,會公開為 JSON 陣列。 向量的每個元素都會儲存為單精度 (4 位元組) 浮點值。
注意
此數據類型處於預覽狀態,而且可能會變更。 請務必閱讀在線服務服務服務等級協定 (SLA) 檔中的預覽使用規定。 如需目前預覽的限制,請參閱 限制 和 已知問題。
如需在 SQL 資料庫 中使用向量數據的詳細資訊,請參閱:
範例語法
向量類型的使用語法類似於數據表中所有其他 SQL Server 數據類型。
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
維度
向量必須至少有一個維度。 支持的維度數目上限為 1998。
範例
A. 資料行定義
向量類型可用於語句中包含的CREATE TABLE
資料行定義,例如:
下列範例會建立具有向量數據行的數據表,並將數據插入其中。
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL
);
INSERT INTO dbo.vectors (id, v) VALUES
(1, '[0.1, 2, 30]'),
(2, '[-100.2, 0.123, 9.876]');
SELECT * FROM dbo.vectors;
B. 變數中的使用方式
下列範例會使用新的 向量數據類型宣告向量 ,並使用函式計算距離 VECTOR_DISTANCE
。
向 量 類型可以搭配變數使用:
DECLARE @v VECTOR(3) = '[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
功能可用性
Azure SQL 資料庫 目前預覽向量原生支援。
新的 向量 類型可在所有資料庫相容性層級下使用。
相容性
為了讓所有用戶端都能在向量數據上運作,向量會公開為 varchar(max) 類型。 用戶端應用程式可以使用向量數據,就像是 JSON 陣列一樣。 引擎會自動將向量轉換成 JSON 陣列,使用戶端的新類型變得透明。 由於這種方法,所有驅動程式和所有語言都會自動與新類型相容。
您可以立即開始使用新的向量類型。 以下是部分範例:
使用 C# 時,可以使用 類別,將向量串行化和還原串行化為字串 JsonSerializer
。
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));
}
}
限制
進行中的預覽有下列限制:
資料表
- 除了條件約束之外
NULL
/NOT NULL
,不支持數據行層級條件約束。DEFAULT
向量數據行不支援和CHECK
條件約束。- 向量資料行不支援索引鍵條件約束,例如
PRIMARY KEY
或FOREIGN KEY
。 相等、唯一性、使用向量數據行做為索引鍵的聯結,且排序順序不適用於 向量 數據類型。 - 向量沒有唯一性的概念,因此不適用唯一條件約束。
- 檢查向量內的值範圍也不適用。
- 向量不支持比較、加法、減法、乘法、除法、串連或任何其他數學、邏輯和複合指派運算符。
- 向量 數據行不能用於記憶體優化數據表中。
- 不允許使用
ALTER TABLE ... ALTER COLUMN
將向量數據行變更為其他數據類型。
數據表架構元數據
sp_describe_first_result_set系統預存程式無法正確傳回向量數據類型。 因此,許多數據存取客戶端和驅動程式都會看到 varchar 或 nvarchar 數據類型。
INFORMATION_SCHEMA.COLUMNS
使用向量類型作為 varbinary 來報告數據行。 取得正確數據類型的因應措施是使用sys.columns
系統檢視。sys.columns
傳回以位元組為單位的向量長度。 若要取得維度數目,請使用下列公式:dimensions = (length - 8) / 4
其中
length
是 所max_length
傳回的值。 例如,如果您看到max_length
20 個字節的 ,維度數目是 (20 - 8) / 4 = 3。
轉換
使用 或 從向量類型的隱含和明確轉換可以完成 varchar,而 nvarchar 類型同樣地,只有 varchar 和 nvarchar 可以隱含或明確轉換成向量類型。
CONVERT
CAST
向量類型無法與sql_variant類型搭配使用,或指派給sql_variant變數或數據行。 此限制類似於 varchar(max)、varbinary(max)、nvarchar(max)、xml、json 和 CLR 型數據類型。
尚未支援從 JSON 資料類型轉換和轉換。 因應措施是先從/轉換為 nvarchar(max), 然後再從 JSON 轉換為/從 JSON 轉換。 例如,若要將向量轉換成 JSON 類型:
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]'; SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
和 從 JSON 類型轉換成向量:
DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30) SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
索引數
- 向量數據行不允許 B 型樹狀結構索引或數據行存放區索引。 不過, 向量 數據行可以指定為索引定義中的內含數據行。
使用者定義型別
- 不允許針對向量類型建立別名類型
CREATE TYPE
,類似於 xml 和 json 資料類型的行為。
總帳資料表
- 如果資料庫包含具有向量數據行的數據表,預存程式
sp_verify_database_ledger
將會產生錯誤。
已知問題
在進行中的預覽中,有下列已知問題:
- SQL Server Management Studio、Azure Data Studio 或 VS Code 的 mssql 擴充功能等工具目前可能無法使用向量數據類型來產生具有數據行之數據表的腳本。
- SQL Server Management Studio、Azure Data Studio 或 VS Code 的 mssql 擴充功能等工具,目前可能會報告 varbinary 的數據類型,而不是使用向量類型的數據行向量。
- 如果數據表包含向量類型,則 BCP 目前
BULK INSERT
無法運作。 - 如果數據表使用 向量 類型,則透過 DacFx 匯入和匯出目前無法運作。
- 數據行加密目前 不支援向量 類型。
- Always Encrypted 目前 不支援向量 類型。
- 數據遮罩目前會在入口網站中將向量數據顯示為 varbinary 數據類型。
- 將向量類型傳遞至
LEN
,並DATALENGTH
傳回錯誤 8116 時(datalength 函式自變數 1 的自變數數據類型向量無效)。 - 在某些情況下,當您將向量傳遞至預存程式或函式時,可能會收到錯誤 42211(轉換期間不允許截斷向量)。 因應措施是改為使用 nvarchar(max) 向量類型。
這些問題將會在未來的更新中修正,並據以更新檔。