適用対象: 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 次元の制限を 2 倍にしています。 この機能により、より表現力豊かな埋め込みと、text-embedding-largeなどの大規模なモデルとの互換性が実現します。ストレージとメモリのフットプリントの削減
ベクターを 16 ビット形式で格納すると、全精度ベクトルと比較して、必要なストレージの量が大幅に減少します。 これにより、大規模な高次元ベクトルの格納とクエリが可能になります。 この最適化により、データ密度も向上し、ベクター検索シナリオでのクエリパフォーマンスを向上させることができます。
ストレージの効率と精度の制御
最も適切な基本の種類を選択します。
-
float16コンパクトストレージ用 -
float32一般的な用途と高精度のタスク用
この柔軟性により、アプリケーションの精度を損なうことなく、最適なリソースの使用が保証されます。
-
構文例
使用構文は ベクター データ型に似ています。 ただし、 float16を使用するには、基本型を明示的に指定します。
column_name VECTOR ( <dimensions> [, <base_type>] ) [ NOT NULL | NULL ]
使用可能な機能
float16 ベクターは現在プレビューで使用できます。 テストするには、 PREVIEW_FEATURES データベース スコープ構成オプションを有効にします。 詳細については、PREVIEW_FEATURES = { ON | OFF }を確認してください。
float16 ベクターは現在、TDS 経由で varchar(max) (JSON 配列) として送信されます。
float16のバイナリ トランスポートサポートは現在使用できません。
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO
例示
既定の基本型または明示的な型を使用して、 ステートメントでCREATE TABLE列を定義します。
既定では、基本型は 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)
);
次の例では、半精度 float ベクター列を持つテーブルを作成し、それにデータを挿入します。
-- 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 AS 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 AS 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 文字列からへのVECTOR(<dimension_count>, float16)な変換と明示的な変換の両方がサポートされます。
DECLARE @j AS JSON = '[1.0, 2.0, 3.0]';
DECLARE @v AS VECTOR(3, float16);
SET @v = CAST (@j AS VECTOR(3, float16)); -- Explicit conversion from JSON to float16
DECLARE @v1 AS VARCHAR (50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = CAST (@v1 AS VECTOR(3, float16)); -- Explicit conversion from VARCHAR to float16
DECLARE @v1 AS NVARCHAR (50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 AS 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 AS VARCHAR (50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = @v1;
-- Implicit conversion from NVARCHAR to float16
DECLARE @v1 AS NVARCHAR (50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = @v1;
--From JSON_ARRAY to VECTOR
DECLARE @v3 AS 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 AS VECTOR(3, float16);
DECLARE @v2 AS 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 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS 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 AS VECTOR(3, float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;
ただし、ディメンション数が指定されていない場合は、エラーが発生します。
DECLARE @v1 AS VECTOR(float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;
範囲外の値
float16の範囲外の値 (たとえば、65504.0 を超えています) では、割り当て中にエラーが発生します。
DECLARE @v AS VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
次のエラーが返されます。
Input JSON contains out-of-range values for float16
関数内の混合基本型
VECTOR_DISTANCEなどの関数の混合基本型はサポートされておらず、型エラーが発生します。
DECLARE @v1 AS VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
次のエラーが返されます。
VECTOR_DISTANCE does not support different base types
サポートされていないアーキテクチャ
float16 Arm64 アーキテクチャではサポートされていません。これを使用するとランタイム エラーが発生します
DECLARE @v1 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, int) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
次のエラーが返されます。
float16 is not supported on ARM64 architecture
SIMD オーバーフロー
AVX2 や SSE4.2 などの単一命令の複数データ (SIMD) ベースの操作では、値が表現可能な範囲を超えるとオーバーフロー エラーが発生する可能性があります。
DECLARE @v AS VECTOR(8) = '[-2.9e+38, ..., 2.9e+38]';
SELECT VECTOR_NORM(@v, 'norm1');
動作は、 ARITHABORT 設定によって異なります。
-
ARITHABORT ON結果としてエラーが発生する -
ARITHABORT OFFの結果はNULLとなる
ツールのサポート
SQL Server Management Studio (SSMS) は現在、UI の float32 と float16 を区別していません。
sys.columnsを使用して、スキーマで使用されている実際の基本型を確認します。
float16 ベクターのバイナリ トランスポートのサポートはまだ利用できません
float16 ベクターは現在、TDS 経由で varchar(max) (JSON 配列) として送信されます。 odbc、JDBC、.NET などのドライバーでは、 float16 のバイナリ トランスポートサポートはまだ使用できません。
注
既定の ベクター 型 ( float32) に適用されるすべての制限は、 VECTOR(float16)にも適用されます。