Freigeben über


VEKTORINDEX ERSTELLEN (Transact-SQL) (Vorschau)

Gilt für: SQL Server 2025 (17.x) Azure SQL DatabaseSQL database in Microsoft Fabric

Erstellen Sie einen ungefähren Index für eine Vektorspalte, um die Leistung der nächsten Nachbarnsuche zu verbessern. Weitere Informationen zur Funktionsweise der Vektorindizierung und Vektorsuche sowie der Unterschiede zwischen exakter und ungefährer Suche finden Sie unter Vektorsuche und Vektorindizes im SQL-Datenbankmodul.

Azure SQL-Datenbank und SQL-Datenbank in Fabric

Die Funktion ist noch in der Vorschau. Überprüfen Sie Einschränkungen und Überlegungen , bevor Sie fortfahren.

Hinweis

Als Previewfunktion unterliegt die in diesem Artikel vorgestellte Technologie den zusätzlichen Nutzungsbedingungen für Microsoft Azure-Vorschauen.

Warnung

Veralteter Hinweis: Vektorindizes, die mit einer früheren Datenstruktur erstellt wurden, werden in der aktuellen Version unterstützt, werden aber in einer zukünftigen Version eingestellt. Um die zukünftige Kompatibilität und den Zugriff auf die neuesten Vektorsuchfunktionen sicherzustellen, migrieren Sie vorhandene Vektorindizes mithilfe der Schritte im Abschnitt "Migrieren von früheren Vektorindexversionen ".

Regionale Verfügbarkeit

Dieses Feature wird in Microsoft Fabric in Azure SQL-Datenbank und SQL-Datenbank bereitgestellt. Während des Rollouts können Verfügbarkeit und Verhalten je nach Region und Indexversion variieren. Wenn ein Feature oder eine Syntax nicht verfügbar ist, wird es automatisch verfügbar, wenn die Bereitstellung abgeschlossen ist. Informationen zum aktuellen regionalen Verfügbarkeitsstatus finden Sie unter Featureverfügbarkeit nach Region.

SQL Server 2025 Vorschaufunktion

In SQL Server 2025 befindet sich diese Funktion in der Vorschau und kann sich ändern. Um dieses Feature verwenden zu können, müssen Sie die PREVIEW_FEATURESDatenbankbereichskonfiguration aktivieren.

Überprüfen Sie die aktuellen Einschränkungen , bevor Sie sie verwenden.

Hinweis

Die neueste Version von Vector Indexes ist derzeit nur in der Azure SQL-Datenbank und sql-Datenbank in Microsoft Fabric verfügbar.

Syntax

Transact-SQL-Syntaxkonventionen

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" } ]
[;]

Argumente

index_name

Der Name des Index. Indexnamen müssen innerhalb einer Tabelle eindeutig sein, müssen aber nicht innerhalb einer Datenbank eindeutig sein. Indexnamen müssen den Regeln von Bezeichnern entsprechen.

Objekt-

Tabelle, auf der der Index erstellt wird. Es muss sich um eine Basistabelle sein. Ansichten, temporäre Tabellen, sowohl lokal als auch global, werden nicht unterstützt.

vector_column

Spalte, die zum Erstellen des Vektorindex verwendet werden soll. Er muss vom Vektortyp sein.

METRIK

Eine Zeichenfolge mit dem Namen der Entfernungsmetrik, die zum Berechnen des Abstands zwischen den beiden angegebenen Vektoren verwendet werden soll. Die folgenden Entfernungsmetriken werden unterstützt:

  • cosine - Kosinusabstand
  • euclidean - Euklidischer Abstand
  • dot - (Negativ) Punktprodukt

TYPE

Der Typ des ANN-Algorithmus , der zum Erstellen des Indexes verwendet wird. Derzeit wird nur DiskANN unterstützt. DiskANN ist der Standardwert.

MAXDOP

Überschreibt den maximalen Grad an Parallelität Konfigurationsoption für den Indexvorgang. Weitere Informationen finden Sie unter Serverkonfiguration: max. Grad der Parallelität. Verwenden Sie MAXDOP, um den Grad der Parallelität und den resultierenden Ressourcenverbrauch für einen Indexbuildvorgang zu begrenzen.

max_degree_of_parallelism kann folgende Werte haben:

  • 1

    Unterdrückt das Generieren paralleler Pläne.

  • >1

    Schränkt den maximalen Grad der Parallelität ein, der in einem parallelen Indexvorgang auf die angegebene Zahl oder weniger basierend auf der aktuellen Systemauslastung verwendet wird.

  • 0 (Standardwert)

    Verwendet den Grad der Parallelität, die auf Server-, Datenbank- oder Workloadgruppenebene angegeben ist, es sei denn, dies ist auf der Grundlage der aktuellen Systemauslastung reduziert.

Weitere Informationen finden Sie unter Konfigurieren von parallelen Indexvorgängen.

Hinweis

Parallele Indexvorgänge sind nicht in jeder Edition von SQL Server verfügbar. Eine Liste der Funktionen, die von den Editionen von SQL Server unterstützt werden, finden Sie unter Editions und unterstützte Funktionen von SQL Server 2022 oder Editions sowie unterstützte Funktionen von SQL Server 2025.

Aktualisieren von Vektorindizes auf die neueste Version

Von Bedeutung

Veralteter Hinweis: Vektorindizes, die mit einer früheren Datenstruktur erstellt wurden, werden in der aktuellen Version unterstützt, werden aber in einer zukünftigen Version eingestellt. Um die zukünftige Kompatibilität und den Zugriff auf die neuesten Vektorsuchfunktionen sicherzustellen, migrieren Sie vorhandene Vektorindizes mithilfe der folgenden Schritte.

Neu erstellte Vektorindizes verwenden automatisch die neueste Datenstruktur, die Folgendes bereitstellt:

  • Vollständige DML-Unterstützung: Entfernt die vorherige Einschränkung, die vektorindizierte Tabellen nach der Indexerstellung schreibgeschützt gemacht hat. Sie können jetzt INSERT-, UPDATE-, DELETE- und MERGE-Vorgänge ausführen und gleichzeitig Vektorindexfunktionen mit automatischer Indizierung in Echtzeit verwalten.
  • Iterative Filterung: Prädikate in der WHERE-Klausel werden während des Vektorsuchvorgangs angewendet, nicht nach dem Abruf
  • Optimierergesteuert: Der Abfrageoptimierer bestimmt automatisch, ob die DiskANN-Index- oder kNN-Suche basierend auf Abfragemerkmalen verwendet werden soll.
  • Erweiterte Quantisierung: Vektorquantisierungstechniken wurden integriert, um eine bessere Speichereffizienz und schnellere Abfrageleistung zu bieten, wobei diese Optimierungen für Benutzer transparent sind.

Ausführliche Informationen zu früheren Einschränkungen der Vektorindexversion finden Sie im Abschnitt "Einschränkungen und Überlegungen".

Migrieren von früheren Vektorindexversionen

Vektorindizes, die mit einer früheren Version erstellt wurden, müssen gelöscht und neu erstellt werden, um die neuesten Funktionen zu aktivieren. In diesem Abschnitt wird erläutert, wie Vektorindexversionen identifiziert, migriert und überprüft werden.

Schritt 1: Identifizieren vorhandener Vektorindizes

Verwenden Sie die folgende Abfrage, um Vektorindizes zu identifizieren, die eine Migration erfordern:

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;
So interpretieren die Ergebnisse

Verwendet die neueste Version

  • Unterstützt bereits iterative Filterung, vollständige DML-Unterstützung, Optimierergesteuerte Ausführung und verbesserte Quantisierung
  • Keine Migration erforderlich

Erstellt mit einer früheren Version

  • Verwendet veraltetes Verhalten nach dem Filtern
  • Unterstützt nicht die neuesten Vektorsuchfunktionen
  • Die Migration wird dringend empfohlen, um die zukünftige Kompatibilität sicherzustellen.

Schritt 2: Ablegen und Neu erstellen sie den Vektorindex

Vektorindizes, die mit einem früheren Format erstellt wurden, können nicht aktualisiert werden. Um die neuesten DiskANN-Funktionen zu aktivieren, legen Sie den Index ab, und erstellen Sie den Index neu.

Warnung

Dienstwirkung: Durch das Ablegen eines Vektorindexes wird die ungefähre Vektorsuche in der betroffenen Tabelle sofort deaktiviert, bis der Index neu erstellt wird. Planen Sie Migrationen während der Wartungsfenster für Produktionssysteme.

Löschen des vorhandenen Indexes
DROP INDEX vec_idx ON dbo.wikipedia_articles;
Neuerstellen des Indexes
CREATE VECTOR INDEX vec_idx
    ON dbo.wikipedia_articles (title_vector)
    WITH (
        TYPE = 'DISKANN',
        METRIC = 'COSINE'
    );

Hinweis

Vektorindizes, die mit der aktuellen CREATE VECTOR INDEX Anweisung erstellt wurden, verwenden automatisch das neueste DiskANN-Format. Es sind keine zusätzlichen Optionen oder Kennzeichnungen erforderlich.

Schritt 3: Überprüfen der Indexversion

Überprüfen Sie nach der Erholung, ob der Index die neueste Version verwendet:

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';

Die index_version Spalte sollte für die neueste Version angezeigt werden 3 .

Fehlerverhalten mit Versionsinkompatibilität

Wenn Sie versuchen, den TOP_N Parameter VECTOR_SEARCH mit einem aktuellen Versionsvektorindex zu verwenden, gibt SQL Server den folgenden Fehler zurück:

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

Um diesen Fehler zu beheben, entfernen Sie den TOP_N Parameter, VECTOR_SEARCH und verwenden Sie stattdessen die SELECT TOP (N) WITH APPROXIMATE Syntax. Ausführliche Informationen finden Sie unter "Fehler mithilfe von Legacysyntax".

Einschränkungen und Überlegungen

Einschränkungen früherer Vektorindexversion

Frühere Vektorindexversionen weisen die folgenden zusätzlichen Einschränkungen auf. Informationen zum Überprüfen der Indexversion finden Sie unter Überprüfen der Indexversion.

  • Nur nach dem Filtern: Prädikate werden nur nach dem Vektorabruf angewendet, nicht während des Suchvorgangs. Dies kann dazu führen, dass weniger Zeilen zurückgegeben werden, als erwartet, wenn Filter angewendet werden.

  • Schreibgeschützte Tabellen: Tabellen mit Vektorindizes sind schreibgeschützt. Nach dem Erstellen des Vektorindexes sind keine DML-Vorgänge (INSERT, UPDATE, DELETE, MERGE) zulässig. Verwenden Sie die ALLOW_STALE_VECTOR_INDEX Datenbankbereichskonfiguration, um DML-Vorgänge zu aktivieren, wenn Sie veraltete Suchergebnisse tolerieren können.

  • Manuelle TOP_N Optimierung: Sie müssen den TOP_N Parameter VECTOR_SEARCH manuell anpassen, um die Nachfilterung zu kompensieren, was häufig überdimensionierte Werte erfordert, um die gewünschte Anzahl von Ergebnissen zu erhalten.

Aktuelle Einschränkungen (gilt auch für die neueste Version)

Die aktuelle Vorschau hat die folgenden Einschränkungen:

  • Vektorindizes können nicht partitioniert werden. Keine Partitionsunterstützung.

  • Die Tabelle muss über einen primärschlüssel gruppierten Index verfügen.

  • Vektorindizes werden nicht für Abonnenten repliziert.

  • Tabellen mit Vektorindizes können nicht mithilfe von TRUNCATE TABLEVektorindizes abgeschnitten werden. Wenn Sie alle Daten entfernen möchten, legen Sie zuerst den Vektorindex ab, kürzen Sie die Tabelle ab, füllen Sie die Tabelle mit mindestens 100 Zeilen erneut aus, und erstellen Sie dann den Index neu. Weitere Informationen finden Sie unter EINSCHRÄNKUNGEN FÜR TRUNCATE TABLE.

Mindestdatenanforderungen

Vektorindizes erfordern eine minimale Anzahl von Zeilen mit Nicht-NULL-Vektorwerten, bevor der Index erstellt werden kann.

  • Minimale Zeilenanzahl: Mindestens 100 Zeilen mit Nicht-NULL-Vektorwerten müssen in der Tabelle vorhanden sein.
  • Fehlerverhalten: Beim Versuch, einen Vektorindex in einer Tabelle mit weniger als 100 Zeilen zu erstellen, schlägt der Fehler Msg 42266 fehl.

Beispielfehler:

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.

Bewährte Methode: Füllen Sie die Tabelle mit mindestens 100 Zeilen auf, bevor Sie den Vektorindex erstellen. Für Entwicklungs- und Testszenarien, in denen weniger Zeilen benötigt werden, VECTOR_SEARCH funktioniert ohne einen Index mit einem Brute-Force-Scanansatz, obwohl die Leistung mit größeren Datasets beeinträchtigt wird.

DML-Unterstützung

Sobald ein DiskANN-Vektorindex mit der neuesten Version erstellt wurde, ist die Tabelle nicht mehr schreibgeschützt. Sie können Daten mithilfe von DML-Operationen (Standard Data Manipulation Language) frei ändern, und Änderungen werden automatisch in Vektorsuchergebnissen wiedergegeben.

Diese Funktion macht die Vektorsuche für Live-, Transaktionsworkloads geeignet, bei denen sich Daten im Laufe der Zeit ändern.

Verhaltensnotizen

  • DML-Vorgänge erfordern kein Ablegen oder Neuerstellen des Vektorindexes.
  • Änderungen sind für Vektorsuchabfragen sichtbar, nachdem die Transaktion commits ausgeführt wurde.
  • Bei der Ersetzung großer Datenmengen (z. B. beim Löschen der meisten Zeilen und Beim Einfügen eines vollständig neuen Satzes von Einbettungen) sollten Sie den Vektorindex nach dem Laden der Daten ablegen und neu erstellen, um eine optimale Suchqualität sicherzustellen.

Hinweis

DML-Unterstützung ist nur für Vektorindizes verfügbar, die mit der neuesten Version erstellt wurden. In früheren Versionen müssen Tabellen schreibgeschützt sein oder die ALLOW_STALE_VECTOR_INDEX Datenbankbereichskonfiguration verwenden.

Überwachen der Vektorindexwartung

Vektorindizes führen Hintergrundwartung durch, um DML-Änderungen zu integrieren. Verwenden Sie die sys.dm_db_vector_indexes dynamische Verwaltungsansicht, um den Status von Index- und Wartungsaufgaben zu überwachen.

Kombinieren von Vektorindizes mit herkömmlichen Indizes

Vektorindizes funktionieren zusammen mit herkömmlichen B-Strukturindizes, um eine optimale Abfrageleistung zu bieten. Bei der Verwendung der iterativen Filterung VECTOR_SEARCHsollten Sie herkömmliche Indizes für Spalten erstellen, die in Filter-Prädikaten verwendet werden.

Ausführliche Informationen zum iterativen Filterverhalten und zur Unterschiede zwischen früheren Versionen finden Sie unter Iteratives Filterverhalten.

Tipp

Der Abfrageoptimierer wählt automatisch die beste Ausführungsstrategie aus (ungefährer nächster Nachbarindex im Vergleich zur kNN-Suche). Verwenden Sie FORCE_ANN_ONLY den Tabellenhinweis, um die Verwendung des ungefähren nächsten Nachbarnindex zu erzwingen. Weitere Informationen finden Sie unter "Tabellenhinweise für die Vektorsuche".

Beispielszenario:

-- 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);

Leistungsvorteil:

Beim Ausführen von Abfragen mit iterativer Filterung verwendet der SQL Server-Abfrageoptimierer beide Indextypen:

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;

In dieser Abfrage

  • Der Vektorindex identifiziert ähnliche Einbettungen basierend auf dem Abfragevektor.
  • Der herkömmliche Index für (category) Filterkandidaten während des iterativen Suchvorgangs effizient

Diese zusammengesetzte Strategie kann die Abfrageleistung im Vergleich zu nur einem Vektorindex erheblich verbessern, insbesondere, wenn Filterprädikate eine hohe Selektivität aufweisen.

Datenqualitäts- und Wartungsleitfaden für Vektorindizes

Vermeiden von Datasets mit hohen doppelten Einbettungen

Die Vektorindizierung funktioniert am besten, wenn Einbettungen verschiedene semantische Inhalte darstellen. Datasets mit einem hohen Anteil an doppelten Vektoren werden nicht für die Vektorindizierung empfohlen.

Hohe Duplizierung kann zu folgendem Führen führen:

  • Schlechte Ergebnisqualität: Doppelte Vektoren werden wiederholt in Ergebnissen angezeigt, wodurch relevantere semantische Übereinstimmungen verdrängt werden.
  • Reduzierte Effektivität: Doppelte Einbettungen verdrängen bessere Nachbarn und verringern die Nützlichkeit der Ähnlichkeitssuche.
  • Unnötige Ressourcennutzung: Vektorindizes sind teuer, um Kosten zu erstellen und zu verwalten, und Duplikate fügen Kosten hinzu, ohne Wert hinzuzufügen.

Bewährte Methode: Deduplicate Embeddings vor dem Erstellen eines Vektorindexes, um sowohl die Leistung als auch die Ergebnisqualität zu verbessern.

Szenarien zum Ersetzen großer Datenmengen

Vektorindizes unterstützen Einfügungen, Aktualisierungen und Löschungen. Wenn jedoch die meisten oder alle Einbettungen ersetzt werden , z. B. das erneute Einbetten eines Datasets mit einem neuen Modell, spiegelt der vorhandene Index möglicherweise nicht mehr die neue Datenverteilung wider.

In groß angelegten Ersetzungsszenarien:

  • Vektorsuchabfragen geben weiterhin gültige Ergebnisse zurück.
  • Die Rückruf- und Bewertungsqualität kann jedoch beeinträchtigt werden, da die Indexstruktur für eine andere Einbettungsverteilung erstellt wurde.

Bewährte Methode: Wenn Sie eine nahezu vollständige Datenersetzung durchführen (Löschen und Einfügen neuer Einbettungen), legen Sie den Vektorindex ab, und erstellen Sie den Vektorindex nach dem Laden der neuen Daten neu. Durch das Erneute Erstellen des Indexes wird sichergestellt, dass er für die neue Einbettungsverteilung optimiert ist und vorhersehbares Abfrageverhalten wiederhergestellt wird.

Bekannte Probleme

Weitere Informationen hierzu können Sie unter " Bekannte Probleme" überprüfen.

Erlaubnisse

Der Benutzer muss über die Berechtigung für die Tabelle verfügen ALTER .

Beispiele

Laden Sie den Wikipedia-Artikel mit Vektoreinbettungsbeispiel herunter und importieren Sie sie.

Beispiele gehen davon aus, dass eine Mit einer Spalte wikipedia_articles vom Typ title_vector benannte vector Tabelle vorhanden ist, in der die Einbettungen von Wikipedia-Artikeln des Titels gespeichert werden. title_vector wird angenommen, dass es sich um eine einbettung handelt, die mit einem Einbettungsmodell wie text-embedding-ada-002 oder text-embedding-3-small generiert wird, das Vektoren mit 1.536 Dimensionen zurückgibt.

Weitere Beispiele, einschließlich End-to-End-Lösungen, finden Sie im GitHub-Repository für Azure SQL-Datenbankvektorsuchbeispiele.

Beispiel 1

Im folgenden Beispiel wird mithilfe der title_vector Metrik ein Vektorindex für die cosine Spalte erstellt.

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

Beispiel 2

Im folgenden Beispiel wird ein Vektorindex für die title_vector Spalte mit der (negativen) dot Produktmetrik erstellt, wobei die Parallelität auf 8 beschränkt und der Vektor in der SECONDARY Dateigruppe gespeichert wird.

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

Beispiel 3

Ein einfaches End-to-End-Beispiel mit CREATE VECTOR INDEX und der zugehörigen VECTOR_SEARCH Funktion. Die Einbettungen werden simuliert. In einem realen Szenario werden Einbettungen mithilfe eines Einbettungsmodells und AI_GENERATE_EMBEDDINGS oder einer externen Bibliothek wie dem OpenAI SDK generiert.

Hinweis

Die neuesten Versionsvektorindizes erfordern mindestens 100 Datenzeilen vor der Indexerstellung. In diesem Beispiel werden 100 Zeilen eingefügt, um diese Anforderung zu erfüllen. Weitere Informationen finden Sie unter Mindestdatenanforderungen.

Der folgende Codeblock veranschaulicht CREATE VECTOR INDEX mit simulierten Einbettungen:

  1. Aktiviert das Vorschaufeature (nur für SQL Server 2025 erforderlich; nicht erforderlich für Azure SQL-Datenbank oder SQL-Datenbank in Fabric).
  2. Erstellen Sie eine Beispieltabelle dbo.Articles mit einer Spalte embedding mit Datentypvektor(5).
  3. Fügen Sie 100 Zeilen mit Beispieldaten mit simulierten Einbettungsdaten ein.
  4. Erstellen Sie einen Vektorindex für dbo.Articles.embedding.
  5. Veranschaulichen Sie die Vektor-Ähnlichkeitssuche mit der VECTOR_SEARCH Funktion.
-- 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;

Die Syntax für die Abfrage hängt von der Vektorindexversion ab:

Vektorindexversion Syntaxbeispiel
Neueste Version TOP_N Ohne Parameter verwenden SELECT TOP (N) WITH APPROXIMATE
Frühere Versionen (veraltet) Parameter in VECTOR_SEARCH Funktion verwenden TOP_N

Für frühere Versionsindizes (veraltete Syntax):

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;

Beispiel 4: Arbeiten mit DML-Vorgängen

Die folgenden Beispiele veranschaulichen DML-Vorgänge in einer Tabelle mit einem Vektorindex, der mit der neuesten Version erstellt wurde.

Löschen von Zeilen

Durch das Löschen von Zeilen werden sie aus den Tabellen- und Vektorsuchergebnissen entfernt.

DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;

Nach Abschluss des Löschvorgangs wird die entfernte Zeile nicht mehr in Vektorsuchabfragen angezeigt.

Einfügen neuer Zeilen

Sie können neue Zeilen mit Einbettungen einfügen und sofort durchsuchbar werden, ohne den Index neu zu erstellen.

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)
);

Neu eingefügte Einbettungen werden automatisch in den Vektorindex integriert und können von nachfolgenden Vektorsuchabfragen zurückgegeben werden.

Vorhandene Zeilen aktualisieren

Das Aktualisieren von Vektorspalten oder nicht Vektorspalten wird vollständig unterstützt.

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;

Wenn eine Vektorspalte aktualisiert wird, wird der Index entsprechend aktualisiert, sodass zukünftige Vektorsuchen die neue Einbettung verwenden.

Verwenden von MERGE für komplexe Vorgänge

Mit der MERGE Anweisung können Sie Einfüge-, Aktualisierungs- und Löschvorgänge in einer einzelnen Anweisung ausführen.

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;

Der Vektorindex wird automatisch aktualisiert, um alle Änderungen widerzuspiegeln, die von der MERGE Anweisung vorgenommen wurden.