Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: SQL Server 2025 (17.x)
Azure SQL-Datenbank
Azure SQL Managed Instance
SQL-Datenbank in Microsoft Fabric
Erstellen Sie einen ungefähren Index in einer Vektorspalte, um die Leistung der Suchergebnisse der nächsten Nachbarn zu verbessern. Um mehr darüber zu erfahren, wie Vektorindexierung und Vektorsuche funktionieren und welche Unterschiede zwischen exakter und approximativer Suche sind, siehe Vektorsuche und Vektorindexe in der SQL Datenbank-Engine.
Verfügbarkeit von Funktionen
- Vector Index und
VECTOR_SEARCHsind allgemein verfügbar (GA) in Azure SQL-Datenbank, SQL-Datenbank in Microsoft Fabric und Azure SQL Managed Instance mit der Always-up-to-Date-Update-Policy. - Vector Index und
VECTOR_SEARCHsind Vorschaufunktionen in SQL Server 2025 (17.x) und in der Azure SQL Managed Instance mit der SQL Server 2025 Update-Policy.
Warnung
Veraltungshinweis: Vektorindizes, die mit einer früheren Datenstruktur erstellt wurden, werden in der aktuellen Version unterstützt, werden aber in einer zukünftigen Version zurückgezogen. Um zukünftige Kompatibilität und Zugang zu den neuesten Vektorsuchfunktionen sicherzustellen, werden bestehende Vektorindizes mithilfe der Schritte im Abschnitt Migration from earlier vector index versions verwendet.
SQL Server 2025 Vorschaufunktion
In SQL Server 2025 und der Azure SQL Managed Instance in der SQL Server 2025Update-Policy sind Vektorindizes und die VECTOR_SEARCH Funktion in der Vorschau und können sich ändern. Um diese Funktion zu nutzen, müssen Sie die PREVIEW_FEATURESDatenbank-Scoped-Konfiguration aktivieren.
Überprüfe die aktuellen Einschränkungen , bevor du es benutzt.
Hinweis
Die neueste Version der Vektorindizes ist im Azure SQL-Datenbank verfügbar, in der SQL-Datenbank in Microsoft Fabric und Azure SQL Managed Instance mit der Update-Richtlinie für immerup-toDatum.
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:
1Unterdrückt das Generieren paralleler Pläne.
>
1Schrä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.
Parallele Indexvorgänge sind nicht in jeder Edition von SQL Server verfügbar. Eine Liste der von den Editionen in SQL Server unterstützten Funktionen finden Sie unter Editions und unterstützte Funktionen von SQL Server 2025.
Aktualisieren von Vektorindizes auf die neueste Version
Von Bedeutung
Hinweis zur Einstellung: Die aktuelle Version unterstützt Vektorindizes, die mit einer früheren Datenstruktur erstellt werden, aber eine zukünftige Version wird diese Unterstützung einstellen lassen. Um zukünftige Kompatibilität und Zugang zu den neuesten Vektorsuchfunktionen sicherzustellen, werden bestehende Vektorindizes mit den folgenden Schritten migriert.
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 nun ,
UPDATE,DELETE, und OperationenMERGEausführenINSERT, während Sie die Vektorindexfunktion mit automatischer, Echtzeit-Indexpflege beibehalten. -
Iterative Filterung: Wendet Prädikate in der
WHEREKlausel während des Vektorsuchprozesses an, nicht nach dem Abruf. - Optimiergesteuert: Der Abfrageoptimierer entscheidet automatisch, ob der DiskANN-Index oder die kNN-Suche basierend auf den Abfrageeigenschaften verwendet wird.
- Fortgeschrittene Quantisierung: Integriert Vektorquantisierungstechniken, um eine bessere Speichereffizienz und eine schnellere Abfrageleistung zu gewährleisten. Diese Optimierungen sind für die Nutzer transparent.
Details zu früheren Vektorindex-Versionsbeschränkungen finden Sie im Abschnitt Einschränkungen und Überlegungen.
Migrieren von früheren Vektorindexversionen
Um die neuesten Funktionen zu aktivieren, müssen Sie Vektorindizes entfernen und neu erstellen, die eine ältere Version verwenden. 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 iteratives Filtern, vollständige DML-Unterstützung, optimierte Ausführung und verbesserte Quantisierung.
- Es ist keine Migration erforderlich.
Erstellt mit einer früheren Version
- Verwendet altes Verhalten nach dem Filter.
- Unterstützt die neuesten Vektorsuchfunktionen nicht.
- Migration wird dringend empfohlen, um die zukünftige Kompatibilität zu gewährleisten.
Schritt 2: Ablegen und Neu erstellen sie den Vektorindex
Du kannst keine Vektorindizes upgraden, die ein früheres Format verwenden. 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 werden, verwenden automatisch das neueste DiskANN-Format. Es sind keine zusätzlichen Optionen oder Kennzeichnungen erforderlich.
Schritt 3: Überprüfen der Indexversion
Nachdem Sie den Index neu erstellt haben, überprüfen Sie, ob die neueste Version verwendet wird:
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 haben folgende Einschränkungen. Informationen zum Überprüfen der Indexversion finden Sie unter Überprüfen der Indexversion.
Nur nach dem Filtern: Prädikate werden erst nach der Vektorabfrage angewendet, nicht während des Suchprozesses. Dieses Verhalten kann dazu führen, dass weniger Zeilen zurückgegeben werden als erwartet, wenn man Filter anwendet.
Schreibgeschützte Tabellen: Tabellen mit Vektorindizes sind schreibgeschützt. Du kannst nach der Erstellung des Vektorindex keine DML-Operationen (
INSERT,UPDATE, ,DELETEMERGE) mehr ausführen. Verwenden Sie dieALLOW_STALE_VECTOR_INDEXDatenbankbereichskonfiguration, um DML-Vorgänge zu aktivieren, wenn Sie veraltete Suchergebnisse tolerieren können.Manuelles TOP_N Tuning: Du musst den
TOP_NParameter manuellVECTOR_SEARCHeinstellen, um das Nachfiltern auszugleichen. Oft braucht man übergroße Werte, um die gewünschte Anzahl an Ergebnissen zu erzielen.
Aktuelle Einschränkungen (gilt auch für die neueste Version)
Die aktuelle Vorschau hat die folgenden Einschränkungen:
Man kann keine Vektorindizes partitionieren.
Die Tabelle muss einen Primärschlüssel-Cluster-Index in einer int-Spalte haben.
Vektorindizes werden nicht für Abonnenten repliziert.
Man kann Tabellen mit Vektorindizes nicht abschneiden, indem man .
TRUNCATE TABLEWenn 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 TRUNCATE TABLE Einschränkungen.Vektorindizes können nicht mit DacPac bereitgestellt werden. Sie können Datenbanken mit Vektorindizes ab DacFx Version 170.5.96 mit BACPAC bereitstellen. Vektorindizes werden nach dem Laden der Tabellendaten erstellt, und die indizierte Tabelle muss mindestens 100 Zeilen mit nicht-vektorischen
NULLWerten enthalten.Während einer reinen DACPAC-Schema-Bereitstellung kann die Bereitstellung erfolgreich sein, ohne den Vektorindex zu erstellen, wenn die Zieltabelle weniger als 100 Zeilen mit Nicht-Vektorwerten
NULLenthält. DacFx erstellt den übersprungenen Index nicht automatisch, wenn später Zeilen hinzugefügt werden. Nach dem Laden von mindestens 100 qualifizierenden Zeilen wird der Vektorindex erstellt, indem man ein Post-Deployment-Skript verwendet, den DACPAC erneut veröffentlicht oder ausführtCREATE VECTOR INDEX.Nach einem Import oder einer Bereitstellung überprüfen Sie, dass der Vektorindex durch Abfrage erstellt
sys.vector_indexeswurde.Als Workaround vor DacFx Version 170.5.96 sollte man vor dem Export der Datenbank die Vektorindizes fallen lassen und die Indizes nach dem Import neu erstellen.
Mindestdatenanforderungen
Vektorindizes erfordern eine Mindestanzahl von Zeilen mit Nicht-VektorwertenNULL , bevor man den Index erstellen kann.
-
Mindestzeilenanzahl: Die Tabelle muss mindestens 100 Zeilen mit Nicht-Vektorwerten
NULLhaben. - Fehlerverhalten: Wenn Sie versuchen, einen Vektorindex in einer Tabelle mit weniger als 100 Zeilen zu erstellen, schlägt die Operation fehl und gibt den Fehler Msg 42266 zurück.
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 Index mit einem Brute-Force-Scan-Ansatz. Diese Methode verschlechtert jedoch die Leistung bei größeren Datensätzen.
DML-Unterstützung
Wenn Sie einen DiskANN-Vektorindex mit der neuesten Version erstellen, ist die Tabelle nicht mehr schreibgeschützt. Sie können Daten mit Standard-Datenmanipulationssprachen (DML)-Operationen modifizieren, und die Änderungen erscheinen automatisch in den Vektorsuchergebnissen.
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 mit 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. Verwenden Sie keine Datensätze mit einem hohen Anteil an doppelten Vektoren für die Vektorindexierung.
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 Sie jedoch die meisten oder alle Embeddings ersetzen – zum Beispiel ein Datensatz mit einem neuen Modell neu einbetten – könnte der bestehende Index die neue Datenverteilung nicht mehr widerspiegeln.
In groß angelegten Ersetzungsszenarien:
- Vektorsuchanfragen liefern weiterhin gültige Ergebnisse.
- Erinnerungs- und Rankingqualität könnten sich verschlechtern, weil die Indexstruktur für eine andere Einbettungsverteilung gebaut 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
Du brauchst ALTER die Erlaubnis am Tisch.
Beispiele
Laden Sie den Wikipedia-Artikel mit Vektoreinbettungsbeispiel herunter und importieren Sie sie.
Diese Beispiele nehmen eine Tabelle mit einer Spalte title_vector des Typs vector an, wikipedia_articles die die Titel-Einbettungen von Wikipedia-Artikeln speichert. Sie title_vector verwendet ein Embedding-Modell wie text-embedding-ada-002 oder text-embedding-3-small, das Vektoren mit 1.536 Dimensionen zurückgibt.
Weitere Beispiele, einschließlich End-to-End-Lösungen, finden Sie im Azure SQL-Datenbank Vector Search Samples GitHub Repository.
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
Das folgende Beispiel erzeugt einen Vektorindex in der title_vector Spalte mit der (negativen) dot Produktmetrik. Sie begrenzt die Parallelität auf 8 und speichert den Vektor in der SECONDARY Dateigruppe.
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
ON [SECONDARY];
Beispiel 3
Dieses Beispiel verwendet CREATE VECTOR INDEX und die zugehörige VECTOR_SEARCH Funktion. Die Einbettungen werden simuliert. In einem realen Szenario generieren Sie Embeddings mit einem Embedding-Modell und AI_GENERATE_EMBEDDINGS oder verwenden Sie eine externe Bibliothek wie das OpenAI SDK.
Hinweis
Die neuesten Vektorindizes benötigen mindestens 100 Datenzeilen, bevor man den Index erstellen kann. 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:
- Aktivieren Sie die Vorschaufunktion (nur für SQL Server 2025 erforderlich; nicht erforderlich für Azure SQL-Datenbank oder SQL Database in Fabric).
- Erstellen Sie eine Beispieltabelle
dbo.Articlesmit einer Spalteembeddingmit Datentypvektor(5). - Fügen Sie 100 Zeilen mit Beispieldaten mit simulierten Einbettungsdaten ein.
- Erstellen Sie einen Vektorindex für
dbo.Articles.embedding. - Veranschaulichen Sie die Vektor-Ähnlichkeitssuche mit der
VECTOR_SEARCHFunktion.
-- 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;
Die Syntax für die Abfrage hängt von der Vektorindexversion ab:
| Vektorindexversion | Syntaxbeispiel |
|---|---|
| Neueste Version |
SELECT TOP (N) WITH APPROXIMATE Ohne Parameter verwenden TOP_N |
| Frühere Versionen (veraltet) | Parameter in TOP_N Funktion verwenden VECTOR_SEARCH |
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 demonstrieren DML-Operationen auf 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 der Löschaktion erscheint die entfernte Zeile in den Vektorsuchanfragen nicht mehr.
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 Sie eine Vektorspalte aktualisieren, aktualisiert sich der Index entsprechend, sodass zukünftige Vektorsuchen die neue Einbettung verwenden.
Verwendung MERGE für komplexe Operationen
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 aktualisiert sich automatisch, um alle Änderungen der Anweisung MERGE widerzuspiegeln.