CREATE VECTOR INDEX (Transact-SQL)

適用対象:SQL Server 2025 (17.x)Azure SQL DatabaseAzure SQL マネージド インスタンスMicrosoft Fabric の SQL データベース

ベクトルカラムに近似インデックスを作成し、最近傍探索の性能を向上させます。 ベクトルインデックス作成やベクトル検索の仕組み、正確検索と近似検索の違いについて詳しく知りたい方は、「SQL データベース エンジンのベクター検索およびベクターインデックス」をご覧ください。

機能の可用性

  • ベクターインデックスとVECTOR_SEARCHは一般に(GA)でAzure SQL Database、SQLデータベースはMicrosoft Fabric、Always-up-to-date更新ポリシーでAzure SQL Managed Instanceしています。
  • ベクターインデックスとVECTOR_SEARCHは、2025 SQL Server(17.x)およびSQL Server 2025アップデートポリシーのAzure SQL Managed Instanceプレビュー機能です。

Warnung

非推奨通知:以前のデータ構造を使用して作成されたベクターインデックスは現在のリリースでサポートされていますが、将来のバージョンで廃止されます。 将来の互換性と最新のベクトル検索機能へのアクセスを確保するために、「 以前のベクターインデックスバージョンからの移行 」セクションの手順を使って既存のベクターインデックスを移行してください。

SQL Server 2025プレビュー機能

2025 SQL ServerおよびSQL Server 2025アップデートポリシー Azure SQL Managed Instanceでは、ベクターインデックスとVECTOR_SEARCH機能はプレビュー中で変更される可能性があります。 この機能を使用するには、 PREVIEW_FEATURESデータベーススコープ設定を有効にする必要があります。

使用前に現在の 制限 を確認してください。

注

ベクターインデックスの最新バージョンはAzure SQL Database、SQLデータベースはMicrosoft Fabric、Always-up-to-date更新ポリシーでAzure SQL Managed Instance利用可能です。

構文

Transact-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 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が表示されます。

バージョン非互換性でのエラー動作

最新バージョンのベクター インデックスを使用して TOP_N で VECTOR_SEARCH パラメーターを使用しようとすると、SQL Server は次のエラーを返します。

Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.

このエラーを解決するには、TOP_Nから VECTOR_SEARCH パラメーターを削除し、代わりにSELECT TOP (N) WITH APPROXIMATE構文を使用します。 詳細については、「 従来の構文を使用したエラー」を参照してください。

制限事項と考慮事項

以前のベクター インデックスバージョンの制限事項

初期のベクトルインデックスバージョンには以下の制限があります。 インデックスのバージョンを確認するには、「 インデックスのバージョンを確認する」を参照してください。

  • フィルタリング後のみ:述語はベクトル検索後にのみ適用され、探索プロセス中には適用されません。 この動作は、フィルターを適用した際に返される行数が予想より少なくなることがあります。

  • 読み取り専用テーブル: ベクター インデックスを持つテーブルは読み取り専用です。 ベクトルインデックスを作成した後は、DML操作(INSERT、 UPDATE、 DELETE、 MERGE)は実行できません。 古い検索結果を許容できる場合は、 ALLOW_STALE_VECTOR_INDEX データベース スコープ構成を使用して DML 操作を有効にします。

  • 手動TOP_Nチューニング:フィルタリング後の補正のために TOP_N パラメータを VECTOR_SEARCH で手動調整する必要があります。 望ましい結果数を得るためには、しばしば大きめの数値が必要です。

現在の制限事項 (最新バージョンにも適用)

現在のプレビューには、次の制限があります。

  • ベクターインデックスは分割できません。

  • テーブルは int 列に主キーのクラスタインデックスを持たなければなりません。

  • ベクター インデックスはサブスクライバーにレプリケートされません。

  • ベクターインデックス付きのテーブルを TRUNCATE TABLEで切り詰めることはできません。 すべてのデータを削除するには、最初にベクター インデックスを削除し、テーブルを切り捨て、少なくとも 100 行を再入力してから、インデックスを再作成します。 詳細については、 TRUNCATE TABLE 制限事項を参照してください。

  • ベクターインデックスはDacPacではデプロイできません。 Bacpacでベクターインデックスを含むデータベースを DacFxバージョン170.5.96から展開できます。 ベクターインデックスはテーブルデータが読み込まれた後に作成され、インデックスされたテーブルにはNULL でないベクター値を持つ少なくとも100行が含まれていなければなりません。

    スキーマのみのDACPAC展開中、ターゲットテーブルに非NULL ベクター値の行が100行未満であれば、ベクトルインデックスを作成しずに展開が成功します。 DacFxは後で行を追加しても自動的にスキップしたインデックスを作成しません。 少なくとも100行の適格なローディングを行った後、展開後スクリプトでベクターインデックスを作成し、DACPACを再公開するか、 CREATE VECTOR INDEXを実行してください。

    インポートやデプロイの後、ベクターインデックスが作成されたか sys.vector_indexesクエリで確認してください。

    DacFxバージョン170.5.96以前の回避策として、データベースをエクスポートする前にベクターインデックスを落とし、インポート後にインデックスを再作成する方法があります。

最小データ要件

ベクトルインデックスは、インデックスを作成する前にNULL 非ベクトル値の最低行数が必要です。

  • 最低行数:テーブルにはNULL 以外のベクトル値を持つ少なくとも100行が必要です。
  • エラー挙動:100行未満のテーブルでベクトルインデックスを作成しようとすると、操作が失敗しエラーMsg 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_articlesというテーブルと、ウィキペディア記事のタイトル埋め込みを格納する型vectorの列title_vectorを前提としています。 この title_vector は、 テキスト-embedding-ada-002 や テキスト-embedding-3-smallのような埋め込みモデルを使用しており、1,536次元のベクトルを返します。

エンドツーエンドソリューションを含むさらなる例については、Azure SQL Database Vector Search Samples GitHubリポジトリをご覧ください。

例 1

次の例では、title_vector メトリックを使用して、cosine列にベクター インデックスを作成します。

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'COSINE', TYPE = 'DISKANN');

例 2

以下の例は、(負の)dot積指標を用いてtitle_vector列にベクトルインデックスを作成します。 並列度を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 を示しています。

  1. プレビュー機能を有効にしてください(SQL Server 2025のみ必要で、Azure SQL DatabaseやFabricのSQLデータベースでは不要)。
  2. データ型 dbo.Articles の列embeddingを含むサンプル テーブル を作成します。
  3. モック埋め込みデータを含む 100 行のサンプル データを挿入します。
  4. dbo.Articles.embeddingにベクター インデックスを作成します。
  5. 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 ' || [value],
    'Content for article ' || [value],
    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使用する
以前のバージョン (非推奨) TOP_N関数でパラメーターVECTOR_SEARCH使用する

以前のバージョンのインデックスの場合 (非推奨の構文):

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 文によるすべての変更を自動的に反映して更新されます。