対象者: SQL Server 2025 (17.x)
Azure SQL Database
SQL database in Microsoft Fabric
ベクトル列に近似インデックスを作成して、最も近い近傍検索のパフォーマンスを向上させます。 ベクター インデックス作成とベクター検索のしくみ、および正確な検索と近似検索の違いの詳細については、 SQL Database エンジンのベクター検索とベクター インデックスを参照してください。
Fabric 内の Azure SQL Database と SQL データベース
この機能はまだプレビュー段階です。 続行 する前に、制限事項と考慮事項を 確認してください。
注
この記事で紹介しているテクノロジはプレビュー機能であり、「Microsoft Azure プレビューの追加利用規約」に従うことを条件として提供されます。
Warnung
非推奨の通知: 以前のデータ構造を使用して作成されたベクター インデックスは、現在のリリースでサポートされていますが、今後のバージョンでは廃止される予定です。 将来の互換性を確保し、最新のベクター検索機能にアクセスするには、「以前のベクター インデックス バージョンからの移行」セクションの手順を使用して、既存の ベクター インデックスを移行 します。
リージョン別の提供状況
この機能は、Microsoft Fabric の Azure SQL Database と SQL データベース全体にデプロイされています。 ロールアウト中の可用性と動作は、リージョンとインデックスのバージョンによって異なる場合があります。 機能または構文を使用できない場合は、デプロイが完了すると自動的に使用できるようになります。 現在のリージョンの可用性の状態については、「 リージョン別の機能の可用性」を参照してください。
SQL Server 2025 プレビュー機能
SQL Server 2025ではこの機能はプレビュー段階で変更される可能性があります。 この機能を使用するには、PREVIEW_FEATURESdatabase スコープ構成を有効にする必要があります。
使用する前に、 現在の制限事項を 確認してください。
注
最新バージョンのベクター インデックスは、現在、Azure SQL Database と Microsoft Fabric の SQL データベースでのみ使用できます。
構文
CREATE VECTOR INDEX index_name
ON object ( vector_column )
[ WITH (
[ , ] METRIC = { 'cosine' | 'dot' | 'euclidean' }
[ [ , ] TYPE = 'DiskANN' ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
) ]
[ ON { filegroup_name | "default" } ]
[;]
論争
index_name
インデックスの名前です。 インデックス名はテーブル内で一意である必要がありますが、データベース内で一意である必要はありません。 インデックス名は 、識別子の規則に従う必要があります。
オブジェクト
インデックスが作成されるテーブル。 ベース テーブルである必要があります。 ローカルとグローバルの両方のビュー (一時テーブル) はサポートされていません。
vector_column
ベクター インデックスの作成に使用する列。 ベクター型である必要があります。
メトリック
指定された 2 つのベクトル間の距離を計算するために使用する距離メトリックの名前を持つ文字列。 次の距離メトリックがサポートされています。
-
cosine- コサイン距離 -
euclidean- ユークリッド距離 -
dot- (負の) ドット積
TYPE
インデックスの作成に使用される ANN アルゴリズム の種類。 現在、DiskANN のみがサポートされています。 DiskANN が既定値です。
MAXDOP
インデックス操作の 並列処理の最大次数 構成オプションをオーバーライドします。 詳細については、「サーバーの構成: 並列処理の最大次数」を参照してください。
MAXDOPを使用して、並列処理の程度と、インデックス作成操作の結果のリソース消費量を制限します。
max_degree_of_parallelism は次のように指定できます。
1並列プラン生成を抑制します。
>1
並列インデックス操作で使用される並列処理の最大次数を、現在のシステム ワークロードに基づいて指定された数以下に制限します。
0(既定値)現在のシステム ワークロードに基づいて減らされない限り、サーバー、データベース、またはワークロード グループ レベルで指定された並列処理の次数を使用します。
詳細については、「 並列インデックス操作の構成」を参照してください。
注
並列インデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。 SQL Server エディションでサポートされている機能の一覧については、「 SQL Server 2022 のエディションおよびサポート機能 」または 「SQL Server 2025 のエディションとサポート機能」をご覧ください。
ベクター インデックスを最新バージョンにアップグレードする
Important
非推奨の通知: 以前のデータ構造を使用して作成されたベクター インデックスは、現在のリリースでサポートされていますが、今後のバージョンでは廃止される予定です。 将来の互換性を確保し、最新のベクター検索機能にアクセスするには、次の手順を使用して既存のベクター インデックスを移行します。
新しく作成されたベクター インデックスでは、次の機能を提供する最新のデータ構造が自動的に使用されます。
- 完全な DML サポート: インデックスの作成後にベクター インデックス付きテーブルを読み取り専用にした以前の制限を削除します。 自動でリアルタイムのインデックス メンテナンスを使用してベクター インデックス機能を維持しながら、INSERT、UPDATE、DELETE、MERGE の各操作を実行できるようになりました
- 反復フィルター処理: WHERE 句の述語は、取得後ではなく、ベクター検索プロセス中に適用されます
- オプティマイザー駆動型: クエリ オプティマイザーは、クエリ特性に基づいて DiskANN インデックスまたは kNN 検索のどちらを使用するかを自動的に決定します
- 高度な量子化: ベクター量子化手法が統合され、ストレージ効率が向上し、クエリパフォーマンスが向上し、これらの最適化がユーザーに対して透過的になりました
以前のベクター インデックスのバージョン制限の詳細については、「制限事項と考慮事項」セクションを参照してください。
以前のベクター インデックス バージョンからの移行
最新の機能を有効にするには、以前のバージョンを使用して作成されたベクター インデックスを削除して再作成する必要があります。 このセクションでは、ベクター インデックスのバージョンを識別、移行、検証する方法について説明します。
手順 1: 既存のベクター インデックスを識別する
次のクエリを使用して、移行を必要とするベクター インデックスを特定します。
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version,
CASE
WHEN JSON_VALUE(v.build_parameters, '$.Version') >= '3'
THEN 'Uses latest version (no migration required)'
WHEN JSON_VALUE(v.build_parameters, '$.Version') < '3'
THEN 'Created using an earlier version (migration recommended)'
ELSE 'Unknown format'
END AS migration_status
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
ORDER BY t.name, i.name;
結果の解釈の方法
最新バージョンを使用
- 反復フィルタリング、完全な DML サポート、オプティマイザー駆動実行、量子化の改善が既にサポートされています
- 移行は必要ありません
以前のバージョンを使用して作成されました
- 従来のフィルター後の動作を使用します
- 最新のベクター検索機能をサポートしていません
- 将来の互換性を確保するために、移行を強くお勧めします
手順 2: ベクター インデックスを削除して再作成する
以前の形式を使用して作成されたベクター インデックスをインプレースアップグレードすることはできません。 最新の DiskANN 機能を有効にするには、インデックスを削除して再作成します。
Warnung
サービスへの影響: ベクター インデックスを削除すると、インデックスが再作成されるまで、影響を受けるテーブルの近似ベクトル検索が直ちに無効になります。 運用システムのメンテナンス期間中に移行を計画します。
既存のインデックスを削除する
DROP INDEX vec_idx ON dbo.wikipedia_articles;
インデックスを再作成する
CREATE VECTOR INDEX vec_idx
ON dbo.wikipedia_articles (title_vector)
WITH (
TYPE = 'DISKANN',
METRIC = 'COSINE'
);
注
現在の CREATE VECTOR INDEX ステートメントを使用して作成されたベクター インデックスでは、最新の DiskANN 形式が自動的に使用されます。 追加のオプションやフラグは必要ありません。
手順 3: インデックスのバージョンを確認する
再作成後、インデックスで最新バージョンが使用されていることを確認します。
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
WHERE i.name = 'vec_idx';
index_version列には、最新バージョンの3が表示されます。
バージョン非互換性でのエラー動作
最新バージョンのベクター インデックスを使用して VECTOR_SEARCH で TOP_N パラメーターを使用しようとすると、SQL Server は次のエラーを返します。
Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.
このエラーを解決するには、VECTOR_SEARCHから TOP_N パラメーターを削除し、代わりにSELECT TOP (N) WITH APPROXIMATE構文を使用します。 詳細については、「 従来の構文を使用したエラー」を参照してください。
制限事項と考慮事項
以前のベクター インデックスバージョンの制限事項
以前のベクター インデックスバージョンには、次の追加の制限があります。 インデックスのバージョンを確認するには、「 インデックスのバージョンを確認する」を参照してください。
後フィルター処理のみ: 述語は、検索プロセス中ではなく、ベクター取得後にのみ適用されます。 フィルターを適用すると、返される行数が予想よりも少なくなる可能性があります。
読み取り専用テーブル: ベクター インデックスを持つテーブルは読み取り専用です。 ベクター インデックスの作成後、DML 操作 (INSERT、UPDATE、DELETE、MERGE) は許可されません。 古い検索結果を許容できる場合は、
ALLOW_STALE_VECTOR_INDEXデータベース スコープ構成を使用して DML 操作を有効にします。手動TOP_Nチューニング:
VECTOR_SEARCHでTOP_Nパラメーターを手動で調整して、後フィルター処理を補正する必要があります。多くの場合、目的の結果数を取得するには特大の値が必要です。
現在の制限事項 (最新バージョンにも適用)
現在のプレビューには、次の制限があります。
ベクター インデックスはパーティション分割できません。 パーティションはサポートされません。
テーブルには、主キークラスター化インデックスが必要です。
ベクター インデックスはサブスクライバーにレプリケートされません。
ベクター インデックスを持つテーブルは、
TRUNCATE TABLEを使用して切り捨てることはできません。 すべてのデータを削除するには、最初にベクター インデックスを削除し、テーブルを切り捨て、少なくとも 100 行を再入力してから、インデックスを再作成します。 詳細については、 TRUNCATE TABLE の制限を参照してください。
最小データ要件
ベクター インデックスでは、インデックスを作成する前に、NULL 以外のベクター値を持つ行の最小数が必要です。
- 最小行数: NULL 以外のベクター値を持つ少なくとも 100 行がテーブルに存在する必要があります。
- エラー動作: 100 行未満のテーブルにベクター インデックスを作成しようとすると、エラー メッセージ 42266 で失敗します。
エラー例:
Msg 42266, Level 16, State 1
Cannot create a vector index. The table contains only 8 rows with non-null vectors,
but at least 100 are required for vector index creation.
ベスト プラクティス: ベクター インデックスを作成する前に、テーブルに少なくとも 100 行を設定します。 必要な行数が少ない開発およびテストシナリオでは、 VECTOR_SEARCH はブルートフォース スキャン アプローチを使用してインデックスなしで動作しますが、大規模なデータセットではパフォーマンスが低下します。
DML のサポート
最新バージョンを使用して DiskANN ベクター インデックスが作成されると、テーブルは読み取り専用ではなくなります。 標準のデータ操作言語 (DML) 操作を使用してデータを自由に変更でき、変更はベクター検索結果に自動的に反映されます。
この機能により、ベクター検索は、時間の経過とともにデータが変化するライブ トランザクション ワークロードに適しています。
動作に関する注意事項
- DML 操作では、ベクター インデックスを削除または再構築する必要はありません。
- 変更は、トランザクションのコミット後にベクター検索クエリに表示されます。
- 大規模なデータ置換 (ほとんどの行の削除やまったく新しい埋め込みのセットの挿入など) の場合は、最適な検索品質を確保するために、データ読み込みの後にベクター インデックスを削除して再作成することを検討してください。
注
DML のサポートは、最新バージョンを使用して作成されたベクター インデックスでのみ使用できます。 以前のバージョンでは、テーブルを読み取り専用にするか、 ALLOW_STALE_VECTOR_INDEX データベース スコープ構成を使用する必要があります。
ベクター インデックスのメンテナンスの監視
ベクター インデックスは、DML の変更を組み込むためにバックグラウンド メンテナンスを実行します。 sys.dm_db_vector_indexes動的管理ビューを使用して、インデックスの正常性とメンテナンス タスクの状態を監視します。
ベクター インデックスと従来のインデックスの組み合わせ
ベクター インデックスは、従来の B ツリー インデックスと共に機能し、最適なクエリ パフォーマンスを提供します。
VECTOR_SEARCHで反復的なフィルター処理を使用する場合は、フィルター述語で使用される列に対して従来のインデックスを作成することを検討してください。
反復的なフィルター処理の動作と、以前のバージョンとの違いについて詳しくは、「 反復的なフィルター処理の動作」をご覧ください。
ヒント
クエリ オプティマイザーは、最適な実行戦略 (近似最近隣インデックスと kNN 検索) を自動的に選択します。 近似最近隣インデックスを強制的に使用するには、 FORCE_ANN_ONLY テーブル ヒントを使用します。 詳細については、 ベクター検索のテーブル ヒントを参照してください。
サンプル シナリオ:
-- Create vector index for similarity search
CREATE VECTOR INDEX idx_embeddings_vector
ON product_embeddings(embedding)
WITH (METRIC = 'cosine');
-- Create traditional index for filter columns
CREATE NONCLUSTERED INDEX idx_embeddings_filters
ON product_embeddings(category);
パフォーマンス上の利点:
反復フィルター処理を使用してクエリを実行する場合、SQL Server クエリ オプティマイザーでは次の両方のインデックスの種類が使用されます。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'wireless headphones' USE MODEL EmbeddingModel);
SELECT TOP (10) WITH APPROXIMATE
p.name,
p.price,
vs.distance
FROM products p
INNER JOIN VECTOR_SEARCH(
TABLE = product_embeddings AS e,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS vs ON p.id = e.product_id
WHERE e.approved = 1
AND e.category = 'Electronics' -- Can use traditional index
ORDER BY vs.distance;
このクエリの場合:
- ベクター インデックスは、クエリ ベクターに基づいて同様の埋め込みを識別します
-
(category)の従来のインデックスは、反復検索プロセス中に候補を効率的にフィルター処理します
この複合戦略は、特にフィルター述語の選択度が高い場合に、ベクター インデックスのみを使用する場合と比べてクエリのパフォーマンスを大幅に向上させることができます。
ベクター インデックスのデータ品質とメンテナンスに関するガイダンス
埋め込みの重複が多いデータセットを回避する
ベクター インデックス作成は、埋め込みによって多様なセマンティック コンテンツが表される場合に最適です。 ベクターインデックス作成では、重複ベクトルの割合が高いデータセットは推奨されません。
重複が大きいと、次の原因が生じる可能性があります。
- 結果の品質が低い: 重複ベクトルが結果に繰り返し表示され、より関連性の高いセマンティック 一致が混雑します。
- 効果の低下: 重複する埋め込みにより、より優れた近隣ノードが置き換えられます。これにより、類似性検索の有用性が低下します。
- 不要なリソースの使用: ベクター インデックスはビルドと保守にコストがかかり、重複すると値を追加せずにコストが追加されます。
ベスト プラクティス: ベクター インデックスを作成する前に埋め込みを重複除去して、パフォーマンスと結果の品質の両方を向上させます。
大規模なデータ置換シナリオ
ベクター インデックスでは、挿入、更新、および削除がサポートされます。 ただし、データセットを新しいモデルで再埋め込みするなど、ほとんどの埋め込みまたはすべての埋め込みを置き換えると、既存のインデックスに新しいデータ分布が反映されなくなる可能性があります。
大規模な置換シナリオでは、次の操作を行います。
- ベクター検索クエリは引き続き有効な結果を返します
- ただし、インデックス構造が別の埋め込みディストリビューション用に構築されているため、再現率とランク付けの品質が低下する可能性があります。
ベスト プラクティス: ほぼ完全なデータ置換 (新しい埋め込みの削除と挿入) を実行する場合は、新しいデータを読み込んだ後、ベクター インデックスを削除して再作成します。 インデックスを再作成すると、新しい埋め込みディストリビューション用に最適化され、予測可能なクエリ動作が復元されます。
既知の問題
詳細については、「既知の 問題」を参照してください。
権限
ユーザーには、テーブルに対する ALTER 権限が必要です。
例示
ベクター埋め込みサンプルを含む Wikipedia の記事をダウンロードしてインポートします。
例では、タイトルの Wikipedia 記事の埋め込みを格納するwikipedia_articles型の列title_vectorvectorという名前のテーブルが存在することを前提としています。
title_vector は、1,536 次元のベクトルを返す text-embedding-ada-002 や text-embedding-3-small などの埋め込みモデルで生成された埋め込みであると見なされます。
エンド ツー エンド ソリューションなど、その他の例については、 Azure SQL Database Vector Search サンプル GitHub リポジトリを参照してください。
例 1
次の例では、title_vector メトリックを使用して、cosine列にベクター インデックスを作成します。
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'COSINE', TYPE = 'DISKANN');
例 2
次の例では、(負の) title_vector積メトリックを使用してdot列にベクター インデックスを作成し、並列処理を 8 に制限し、SECONDARY ファイル グループにベクターを格納します。
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
ON [SECONDARY];
例 3
CREATE VECTOR INDEXと関連するVECTOR_SEARCH関数を使用した基本的なエンドツーエンドの例。 埋め込みはモックされます。 実際のシナリオでは、埋め込みモデルと AI_GENERATE_EMBEDDINGS、または OpenAI SDK などの外部ライブラリを使用して埋め込みが生成されます。
注
最新バージョンのベクター インデックスでは、インデックスの作成前に少なくとも 100 行のデータが必要です。 この例では、この要件を満たすために 100 行を挿入します。 詳細については、「 最小データ要件」を参照してください。
次のコード ブロックは、モック埋め込みの CREATE VECTOR INDEX を示しています。
- プレビュー機能を有効にします (SQL Server 2025 にのみ必要です。Azure SQL Database または Fabric の SQL データベースには必要ありません)。
- データ型
dbo.Articlesの列embeddingを含むサンプル テーブル を作成します。 - モック埋め込みデータを含む 100 行のサンプル データを挿入します。
-
dbo.Articles.embeddingにベクター インデックスを作成します。 -
VECTOR_SEARCH関数を使用してベクトルの類似性検索を示します。
-- Step 0: Enable Preview Feature (SQL Server 2025 only)
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
id INT PRIMARY KEY,
title NVARCHAR(100),
content NVARCHAR(MAX),
embedding VECTOR(5) -- mocked embeddings
);
GO
-- Step 2: Insert sample data (100 rows required for latest version indexes)
INSERT INTO Articles (id, title, content, embedding)
SELECT
value AS id,
'Article ' + CAST(value AS NVARCHAR(10)),
'Content for article ' + CAST(value AS NVARCHAR(10)),
CAST(JSON_ARRAY(
CAST(value * 0.01 AS FLOAT),
CAST(value * 0.02 AS FLOAT),
CAST(value * 0.03 AS FLOAT),
CAST(value * 0.04 AS FLOAT),
CAST(value * 0.05 AS FLOAT)
) AS VECTOR(5))
FROM GENERATE_SERIES(1, 100);
GO
-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO
-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3) WITH APPROXIMATE
t.id,
t.title,
t.content,
s.distance
FROM
VECTOR_SEARCH(
TABLE = Articles AS t,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS s
ORDER BY s.distance, t.title;
クエリの構文は、ベクター インデックスのバージョンによって異なります。
| ベクター インデックスのバージョン | 構文の例 |
|---|---|
| 最新バージョン | パラメーターを指定せずにSELECT TOP (N) WITH APPROXIMATETOP_N使用する |
| 以前のバージョン (非推奨) |
VECTOR_SEARCH関数でパラメーターTOP_N使用する |
以前のバージョンのインデックスの場合 (非推奨の構文):
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
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;
例 4: DML 操作の操作
次の例では、最新バージョンを使用して作成されたベクター インデックスを持つテーブルに対する DML 操作を示します。
行を削除する
行を削除すると、テーブルとベクターの両方の検索結果から削除されます。
DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;
削除が完了すると、削除された行はベクター検索クエリに表示されなくなります。
新しい行を挿入する
埋め込みを使用して新しい行を挿入すると、インデックスを再構築せずにすぐに検索できるようになります。
INSERT INTO dbo.wikipedia_articles (id, title, title_vector)
VALUES (
99999,
N'Quantum Computing Basics',
AI_GENERATE_EMBEDDINGS(N'Quantum Computing Basics' USE MODEL Ada2Embeddings)
);
新しく挿入された埋め込み関数は、自動的にベクター インデックスに組み込まれ、後続のベクター検索クエリによって返されます。
既存の行を更新する
ベクター列または非ベクター列の更新は完全にサポートされています。
DECLARE @new_embedding VECTOR(1536);
SET @new_embedding = AI_GENERATE_EMBEDDINGS(N'Updated article title' USE MODEL Ada2Embeddings);
UPDATE dbo.wikipedia_articles
SET title_vector = @new_embedding,
title = N'Updated article title'
WHERE id = 50000;
ベクター列が更新されると、それに応じてインデックスが更新されるため、将来のベクター検索では新しい埋め込みを使用します。
複雑な操作に MERGE を使用する
MERGE ステートメントを使用すると、1 つのステートメントで挿入、更新、および削除の操作を実行できます。
MERGE INTO dbo.wikipedia_articles AS target
USING (
SELECT
id,
title,
AI_GENERATE_EMBEDDINGS(title USE MODEL Ada2Embeddings) AS title_vector
FROM dbo.staging_articles
) AS source
ON target.id = source.id
WHEN MATCHED THEN
UPDATE SET
title = source.title,
title_vector = source.title_vector
WHEN NOT MATCHED BY TARGET THEN
INSERT (id, title, title_vector)
VALUES (source.id, source.title, source.title_vector)
WHEN NOT MATCHED BY SOURCE AND target.id > 100000 THEN
DELETE;
ベクター インデックスは、 MERGE ステートメントによって行われたすべての変更を反映するように自動的に更新されます。