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 Database
SQL database in Microsoft Fabric
Suchen Sie nach Vektoren, die einem bestimmten Abfragevektor ähneln, mithilfe eines ungefähren Nächstenvektorsuchalgorithmus. 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 die aktuellen Einschränkungen , bevor Sie sie verwenden.
Hinweis
Als Previewfunktion unterliegt die in diesem Artikel vorgestellte Technologie den zusätzlichen Nutzungsbedingungen für Microsoft Azure-Vorschauen.
Von Bedeutung
Um optimale Leistung zu erzielen und auf die neuesten Vektorsuchfunktionen zuzugreifen, verwenden Sie Vektorindizes, die mit der neuesten Version erstellt wurden. Weitere Informationen zum Aktualisieren vorhandener Indizes und zum Vergleichen von Versionen finden Sie unter CREATE VECTOR INDEX – Upgradevektorindizes auf die neueste Version.
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.
Warnung
Veralteter Hinweis: Der TOP_N Parameter ist VECTOR_SEARCH veraltet und wird nur zur Abwärtskompatibilität mit Vektorindizes früherer Versionen beibehalten. Stattdessen sollten neue Implementierungen Syntax verwenden SELECT TOP (N) WITH APPROXIMATE . Weitere Informationen finden Sie unter Syntax.
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.
Wichtige Verbesserungen mit den neuesten Vektorindizes
Mit der neuesten Version erstellte Vektorindizes führen zu erheblichen Verbesserungen:
- 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.
Syntax
Transact-SQL-Syntaxkonventionen
Mit den neuesten Versionsvektorindizes:
Von Bedeutung
Beim Abfragen von Tabellen, die die neueste Vektorindexversion verwenden, muss die ungefähre Vektorsuche die TOP-Syntax (N) UNGEFÄHR verwenden. Diese Syntaxanforderung gibt an, dass die Abfrage explizit ungefähre Benachbarte Ergebnisse anfordert.
SELECT TOP (N) WITH APPROXIMATE
column_list
FROM VECTOR_SEARCH(
TABLE = object [ AS source_table_alias ]
, COLUMN = vector_column
, SIMILAR_TO = query_vector
, METRIC = { 'cosine' | 'dot' | 'euclidean' }
) [ AS result_table_alias ]
[ WHERE predicate ]
ORDER BY distance;
Mit Vektorindizes früherer Versionen:
VECTOR_SEARCH(
TABLE = object [ AS source_table_alias ]
, COLUMN = vector_column
, SIMILAR_TO = query_vector
, METRIC = { 'cosine' | 'dot' | 'euclidean' }
, TOP_N = k
) [ AS result_table_alias ]
Von Bedeutung
Der TOP_N Parameter wird mit den neuesten Versionsvektorindizes nicht unterstützt. Verwenden Sie die SELECT TOP (N) WITH APPROXIMATE oben gezeigte Syntax. Weitere Informationen finden Sie unter "Fehler mithilfe von Legacysyntax".
Arguments
TABLE = Objekt [AS source_table_alias]
Tabelle, in der die Suche ausgeführt wird. Es muss sich um eine Basistabelle sein. Ansichten, temporäre Tabellen, sowohl lokal als auch global, werden nicht unterstützt.
SPALTE = vector_column
Die Vektorspalte, in der die Suche ausgeführt wird. Die Spalte muss ein Vektordatentyp sein.
SIMILAR_TO = query_vector
Der für die Suche verwendete Vektor. Es muss sich um eine Variable oder eine Spalte vom Vektortyp sein.
METRIC = { 'Kosinus' | 'dot' | 'euklidan' }
Die Entfernungsmetrik, die zum Berechnen des Abstands zwischen dem Abfragevektor und den Vektoren in der angegebenen Spalte verwendet wird. Ein ANN-Index (Näherste Nachbar) wird nur verwendet, wenn ein übereinstimmender ANN-Index mit derselben Metrik und in derselben Spalte gefunden wird. Wenn keine kompatiblen ANN-Indizes vorhanden sind, wird eine Warnung ausgelöst, und der kNN-Algorithmus (k-nächster Nachbar) wird verwendet.
TOP_N = <k>
Warnung
Dieser Parameter ist veraltet und wird nur aus Gründen der Abwärtskompatibilität mit früheren Versionsvektorindizes beibehalten. Verwenden Sie SELECT TOP (N) WITH APPROXIMATE für die neuesten Versionsindizes stattdessen syntax. Neue Implementierungen sollten die neueste Syntax verwenden.
Die maximale Anzahl ähnlicher Vektoren, die zurückgegeben werden müssen. Es muss eine positive ganze Zahl sein. Dieser Parameter wird mit Vektorindizes, die mit der neuesten Version erstellt wurden, nicht unterstützt.
result_table_alias
Der Alias wird verwendet, um auf das Resultset zu verweisen.
Ergebnissatz zurückgeben
Das von der VECTOR_SEARCH Funktion zurückgegebene Resultset umfasst:
Alle Spalten aus der im
TABLEArgument angegebenen Tabelle.Eine zusätzliche Spalte mit dem Namen
distance, die den Abstand zwischen dem Vektor in der spalte darstellt, die durch dasCOLUMNArgument und den imSIMILAR_TOArgument angegebenen Vektor angegeben ist.
Die Abstandsspalte wird von der VECTOR_SEARCH Funktion selbst generiert, während alle anderen Spalten aus der Tabelle stammen, auf die TABLE im Argument verwiesen wird.
Wenn Sie einen Alias für die Tabelle im TABLE Argument verwenden, müssen Sie diesen Alias verwenden, um auf die Spalten in der SELECT Anweisung zu verweisen. Sie können den Alias, der zugewiesen ist, nicht verwenden, VECTOR_SEARCH um auf Spalten aus der in TABLEder Tabelle angegebenen zu verweisen. Dieses Verhalten ist einfacher zu verstehen, wenn Sie sich das resultset vorstellen, das erstellt wurde, indem Sie die Ausgabe der VECTOR_SEARCH Tabelle mit den Tabellendaten zusammenführen.
Wenn die im TABLE Argument angegebene Tabelle bereits eine Spalte mit dem Namen distanceenthält, ähnelt das Verhalten einer SQL-Verknüpfung zwischen zwei Tabellen, die einen Spaltennamen verwenden. In solchen Fällen müssen Sie Tabellenalias verwenden, um die Spaltenverweise zu disambiguieren. Andernfalls wird ein Fehler ausgelöst.
Von Bedeutung
Die distance Spalte ist der einzige gültige Sortierschlüssel für ungefähre Vektorsuchergebnisse.
Limitations
-
Nur aufsteigende Reihenfolge: Die
distanceSpalte muss in aufsteigender Reihenfolge (ASC) sortiert werden. Absteigende Reihenfolge (DESC) wird nicht unterstützt.
Versionsspezifisches Verhalten
Das Verhalten variiert VECTOR_SEARCH je nach Vektorindexversion.
Frühere Vektorindexversionen
Hinweis
Diese Einschränkungen gelten nur für Vektorindizes, die mit früheren Versionen erstellt wurden. Migrieren Sie zu der neuesten Version, um die iterative Filterung zu aktivieren. Siehe Migrieren von früheren Vektorindexversionen.
Nur nach dem Filtern: Die Vektorsuche erfolgt vor dem Anwenden eines Prädikats. Zusätzliche Prädikate werden erst angewendet, nachdem die meisten ähnlichen Vektoren zurückgegeben wurden. Im folgenden Beispiel werden die obersten 10 Zeilen mit Einbettungen zurückgegeben, die dem Abfragevektor @qvam ähnlichsten sind. Anschließend wird das in der WHERE Klausel angegebene Prädikat angewendet. Wenn keine der 10 Zeilen, die den von der Vektorsuche zurückgegebenen Vektoren zugeordnet sind, die accepted Spalte 1 aufweist, ist das Ergebnis leer.
SELECT TOP (10) s.id,
s.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.sessions AS s,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS r
WHERE accepted = 1
ORDER BY r.distance;
Allgemeine Einschränkungen
VECTOR_SEARCH kann nicht im Textkörper einer Ansicht verwendet werden.
Examples
A. Grundlegende Vektorgleichheitssuche
Von Bedeutung
Beim Abfragen von Tabellen, die die neueste Vektorindexversion verwenden, muss die ungefähre Vektorsuche die TOP (N) WITH APPROXIMATE Syntax verwenden. Diese Syntaxanforderung gibt an, dass die Abfrage explizit ungefähre Benachbarte Ergebnisse anfordert.
Im folgenden Beispiel werden die 10 ähnlichsten Artikel Pink Floyd music style in der wikipedia_articles_embeddings Tabelle gefunden.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles_embeddings AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance;
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 |
Tipp
Informationen zum Ermitteln der Vektorindexversion finden Sie unter Migrieren aus früheren Vektorindexversionen.
Für frühere Versionsindizes (veraltete Syntax):
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10)
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles_embeddings AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10 -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
) AS r
ORDER BY r.distance;
Hinweis
Die Verwendung des TOP_N Parameters mit den neuesten Versionsvektorindizes gibt den Fehler Msg 42274 zurück. Ausführliche Informationen finden Sie unter "Fehler mithilfe von Legacysyntax " im Abschnitt "Erwartete Verhaltensweisen".
B. Vollständiger Workflow mit Indexerstellung
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 die VECTOR_SEARCH Funktion mit simulierten Einbettungen:
- Aktiviert das Vorschaufeature (nur für SQL Server 2025 erforderlich; nicht erforderlich für Azure SQL-Datenbank oder SQL-Datenbank 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)
DECLARE @i INT = 1;
WHILE @i <= 100
BEGIN
INSERT INTO Articles (id, title, content, embedding)
VALUES (
@i,
'Article ' + CAST(@i AS NVARCHAR(10)),
'Content for article ' + CAST(@i AS NVARCHAR(10)),
JSON_ARRAY(
CAST(@i * 0.01 AS FLOAT),
CAST(@i * 0.02 AS FLOAT),
CAST(@i * 0.03 AS FLOAT),
CAST(@i * 0.04 AS FLOAT),
CAST(@i * 0.05 AS FLOAT)
)
);
SET @i = @i + 1;
END
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 -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
) AS s
ORDER BY s.distance, t.title;
C. Vektorsuche mit iterativer Filterung
Im folgenden Beispiel wird die iterative Filterung mit den neuesten Versionsvektorindizes veranschaulicht. Die Abfrage findet ähnliche Artikel beim Anwenden von Prädikaten während des Suchvorgangs.
Bei den neuesten Versionsindizes werden die Prädikate in der WHERE-Klausel während des Vektorsuchvorgangs (nicht nachher) angewendet. Das Modul sucht weiterhin, bis es fünf qualifizierende Zeilen findet, die allen Kriterien entsprechen:
- Vektorähnlichkeit mit "Machine Learning-Algorithmen"
- Kategorie entspricht "Technologie"
- Der Veröffentlichte Status entspricht 1
Dadurch wird sichergestellt, dass Sie genau 5 Ergebnisse (sofern vorhanden) erhalten, ohne die Suchparameter manuell zu optimieren. Einen detaillierten Vergleich zwischen früheren und neuesten Versionen finden Sie unter Iteratives Filterverhalten im Abschnitt "Erwartete Verhaltensweisen".
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning algorithms' USE MODEL Ada2Embeddings);
SELECT TOP (5) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
WHERE t.category = 'Technology'
AND t.published = 1
ORDER BY r.distance;
Hinweis
Bestimmte SQL-Vorgänge wie GROUP BY, Aggregatfunktionen und Fensterfunktionen erfordern ein Unterabfragemuster. Ausführliche Informationen finden Sie unter Kombinieren der Vektorsuche mit anderen SQL-Vorgängen.
D. Verknüpfungen mit mehreren Tabellen mit INNER JOIN
Im folgenden Beispiel wird die INNER JOIN mit Filterung auf mehrere Tabellen veranschaulicht. Wird verwendet, wenn Einbettungen in einer separaten Tabelle von den Hauptentitätsdaten gespeichert werden.
-- Assuming a schema with separate tables for articles and embeddings
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence and machine learning' USE MODEL Ada2Embeddings);
SELECT TOP (10) WITH APPROXIMATE
a.id,
a.title,
a.category,
vs.distance
FROM wikipedia_articles a
INNER JOIN VECTOR_SEARCH(
TABLE = wikipedia_articles_embeddings AS e,
COLUMN = content_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS vs ON a.id = e.article_id
WHERE e.approved = 1 -- Iterative filter on embedding table
AND a.category IN ('Technology', 'Science') -- Filter on main table
AND a.views > 50000
ORDER BY vs.distance;
Die wichtigsten Features dieses Beispiels:
-
Tabellenaliasbereich: Der Alias
eausTABLE = wikipedia_articles_embeddings AS eist in der WHERE-Klausel für die iterative Filterung mit den neuesten Versionsindizes verfügbar.
Erwartete Verhaltensweisen
Fehler bei Verwendung der Legacysyntax
Wenn Sie versuchen, den TOP_N Parameter VECTOR_SEARCH beim Abfragen einer Tabelle 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.
So beheben Sie diesen Fehler:
- Entfernen des
TOP_NParameters aus derVECTOR_SEARCHFunktion - Verwenden Sie
SELECT TOP (N) WITH APPROXIMATEstattdessen syntax
Falsch (erzeugt Fehler mit dem neuesten Versionsindex):
SELECT TOP (10)
t.id,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10 -- This parameter causes the error with latest version indexes
) AS r;
Richtig (funktioniert mit dem neuesten Versionsindex):
SELECT TOP (10) WITH APPROXIMATE -- Specify TOP and WITH APPROXIMATE here
t.id,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
-- No TOP_N parameter
) AS r
ORDER BY r.distance;
Iteratives Filterverhalten
Die neueste Version führt erhebliche Verbesserungen gegenüber früheren Vektorindexversionen ein:
| Aspekt | Frühere Version | Neueste Version |
|---|---|---|
| Prädikatanwendung | Relationale Prädikate wurden angewendet, nachdem die Vektorsuche eine feste Anzahl der nächsten Nachbarn zurückgegeben hat (nur nach dem Filtern) | Relationale Prädikate werden während des Vektorsuchvorgangs angewendet (iterative Filterung) |
| Ergebnisvollständigkeit | Abfragen könnten weniger Zeilen – oder keine Zeilen – zurückgeben, wenn die ursprünglichen nächsten Nachbarn keine Filter erfüllten, auch wenn qualifizierende Zeilen vorhanden waren. | Abfragen geben die erwartete Anzahl von Zeilen zurück, wenn qualifizierende Daten vorhanden sind, ohne dass manuelle Optimierungen oder Abfrageumschreibungen vorhanden sind. |
| TOP-Optimierung (N) | Benutzer mussten häufig TOP-Werte (N) erraten oder überschreiben, um die Nachfilterung zu kompensieren. | Es ist nicht erforderlich, TOP-Werte (N) zu erraten. Das Modul durchsucht, bis genügend qualifizierende Zeilen gefunden werden oder der Suchbereich erschöpft ist. |
| Abfrageoptimierung | Nicht anwendbar | SQL Server wählt automatisch die effizienteste Ausführungsstrategie aus, einschließlich des Wechsels zwischen Vektorindex-Suchvorgängen und kNN-Scans bei Bedarf |
Ein praktisches Beispiel für iterative Filterung finden Sie unter Beispiel C: Vektorsuche mit iterativer Filterung.
ORDER BY-Klauselanforderungen
Bei Verwendung SELECT TOP (N) WITH APPROXIMATEhat die ORDER BY-Klausel spezifische Anforderungen:
- ORDER BY muss vorhanden sein: Abfragen ohne ORDER BY-Klausel schlagen mit Fehler fehl.
- Nur Abstandsspalte zulässig: Die ORDER BY-Klausel darf nur auf die Abstandsspalte des VECTOR_SEARCH Resultsets verweisen. Fehler beim Einschließen zusätzlicher Spalten. Verwenden Sie das unterabfragemuster, das in mehreren ORDER BY-Spalten beschrieben ist, um nach mehreren Spalten zu sortieren.
- Nur aufsteigende Reihenfolge: Die Abstandsspalte muss in aufsteigender Reihenfolge (ASC) sortiert werden. Absteigende Reihenfolge (DESC) wird nicht unterstützt.
Gültige BESTELLUNG NACH:
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance; -- ✓ Valid
Ungültige ORDER BY-Muster:
-- Missing ORDER BY
SELECT TOP (10) WITH APPROXIMATE
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r;
-- ✗ Error Msg 42248: APPROXIMATE cannot be used in a query without ORDER BY
-- Multiple columns in ORDER BY
SELECT TOP (10) WITH APPROXIMATE
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance, t.title;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY
-- on distance column ascending, and no other columns
-- Descending order
SELECT TOP (10) WITH APPROXIMATE
r.distance
FROM VECTOR_SEARCH(
TABLE = products,
COLUMN = embedding,
SIMILAR_TO = @query_vector,
METRIC = 'cosine'
) AS r
ORDER BY r.distance DESC;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY
-- on distance column ascending, and no other columns
Verhalten ohne Vektorindex
VECTOR_SEARCH kann Abfragen auch dann ausführen, wenn in der Zielspalte kein Vektorindex vorhanden ist. Ohne Index führt die Abfrage einen vollständigen Tabellenscan (kNN-Suche) durch, um Entfernungen für alle Zeilen zu berechnen.
Abfrageverhalten ohne TOP WITH APPROXIMATE
Bei Verwendung VECTOR_SEARCH ohne SELECT TOP (N) WITH APPROXIMATE, hängt das Abfrageverhalten vom Vorhandensein und ORDER BY von TOP Klauseln ab:
- Kein TOP, kein ORDER BY- oder ORDER BY-Abstand: Vollständiger Tabellenscan (Brute-Force-Suche), der Entfernungen für alle Zeilen berechnet und zurückgibt
- TOP (keine UNGEFÄHRE) mit ENTFERNUNG VON ORDER BY: Führt als kNN -Suche (k-nächste Nachbarn) aus, bei der es sich um eine genaue Nächste Nachbarsuche handelt.
Beispiel : Vollständige Überprüfung mit Abstandsspalte:
-- Returns all rows with calculated distances
SELECT
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY t.id; -- Not ordering by distance
Beispiel - kNN-Suche (genau nächste Nachbarn):
-- Returns exact top 10 nearest neighbors using kNN
SELECT TOP (10)
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance; -- No WITH APPROXIMATE = exact kNN
TOP WITH APPROXIMATE ohne VECTOR_SEARCH
Die Verwendung SELECT TOP (N) WITH APPROXIMATE ohne Funktion VECTOR_SEARCH in der Abfrage führt zu einem Fehler. Für die WITH APPROXIMATE Klausel muss eine VECTOR_SEARCH Funktion vorhanden sein.
Falsch - Diese Abfrage schlägt fehl:
-- Error: WITH APPROXIMATE requires VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
id,
title,
VECTOR_DISTANCE('cosine', title_vector, @qv) AS distance
FROM dbo.wikipedia_articles
WHERE title_vector IS NOT NULL
ORDER BY VECTOR_DISTANCE('cosine', title_vector, @qv);
Richtig - Verwenden Sie VECTOR_SEARCH:
-- Correct: WITH APPROXIMATE with VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance;
EINSCHRÄNKUNGEN FÜR ABSCHNEIDEN VON TABELLEN
Tabellen mit Vektorindizes können nicht mithilfe von TRUNCATE TABLEVektorindizes abgeschnitten werden. So entfernen Sie alle Daten aus einer vektorindizierten Tabelle:
- Ablegen des Vektorindexes
- Abschneiden der Tabelle
- Aktualisieren der Tabelle mit mindestens 100 Zeilen
- Neuerstellen des Vektorindex
Beispielworkflow:
-- Step 1: Drop the vector index
DROP INDEX idx_vector ON wikipedia_articles;
-- Step 2: Truncate the table
TRUNCATE TABLE wikipedia_articles;
-- Step 3: Repopulate with data (at least 100 rows)
-- ... insert operations ...
-- Step 4: Recreate the vector index
CREATE VECTOR INDEX idx_vector
ON wikipedia_articles(title_vector)
WITH (METRIC = 'cosine');
Tabellenhinweise für die Vektorsuche
Sie können Tabellenhinweise mit der Funktion verwenden, um das VECTOR_SEARCH Ausführungsverhalten von Abfragen zu steuern. Der FORCE_ANN_ONLY Tabellenhinweis erzwingt, dass der Abfrageoptimierer nur den ungefähren benachbarten Index (ANN) verwendet, auch wenn der Optimierer andernfalls eine andere Ausführungsstrategie auswählen kann.
Syntax:
FROM VECTOR_SEARCH(
TABLE = table_name,
COLUMN = column_name,
SIMILAR_TO = vector_value,
METRIC = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)
Example:
Im folgenden Beispiel wird die Verwendung des ungefähren benachbarten Indexes für die Vektorsuchabfrage erzwungen:
DECLARE @qembedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
SELECT TOP 50 WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qembedding,
METRIC = 'cosine'
) AS r WITH (FORCE_ANN_ONLY)
ORDER BY r.distance;
Verwenden Sie FORCE_ANN_ONLY diese Funktion, wenn Sie sicherstellen möchten, dass die Abfrage die ungefähre nächste Nachbarindexstrategie verwendet, wobei die automatische Strategieauswahl des Optimierers überschrieben wird.
Hinweis
Für die Verwendung FORCE_ANN_ONLY sind beides erforderlich:
- Ein Vektorindex für die Zielspalte
-
SELECT TOP (N) WITH APPROXIMATEin der Abfrage
Wenn eine der Anforderungen fehlt, schlägt die Abfrage fehl, da sie nicht die ungefähre nächste Nachbarstrategie verwenden kann, die der Hinweis erzwingt.
Kombinieren der Vektorsuche mit anderen SQL-Vorgängen
Die VECTOR_SEARCH Funktion mit TOP (N) WITH APPROXIMATE spezifischen Anforderungen für die Verwendung. Einige SQL-Vorgänge können direkt mit der Vektorsuche verwendet werden, während andere ein Unterabfragemuster erfordern.
Vorgänge, die ein Unterabfragemuster erfordern
Wenn Sie Vorgänge ausführen müssen, die nicht direkt mit TOP (N) WITH APPROXIMATEdiesem kompatibel sind, verwenden Sie die Vektorsuche in einer Unterabfrage (innere Abfrage), und wenden Sie dann Ihre Vorgänge in der äußeren Abfrage an. Dieses Muster behält die Leistungsvorteile der ungefähren Vektorsuche bei, während die vollständige SQL-Funktionalität aktiviert wird.
Tipp
Das Unterabfragemuster funktioniert für alle Vorgänge, die nicht direkt mit TOP (N) WITH APPROXIMATE. Wenden Sie die Vektorsuche in der inneren Abfrage an, und verwenden Sie dann einen beliebigen SQL-Vorgang in der äußeren Abfrage.
Häufige Szenarien
In der folgenden Tabelle sind Vorgänge aufgeführt, für die das Unterabfragemuster erforderlich ist:
| Vorgang | Exemplarischer Anwendungsfall |
|---|---|
| GRUPPIEREN NACH | Berechnen von Statistiken pro Kategorie |
| Aggregatfunktionen | Gesamtanzahl, AVG, MIN, MAX über Ergebnisse hinweg |
| Fensterfunktionen | ROW_NUMBER, RANK, DENSE_RANK, NTILE |
| Festlegen von Vorgängen | UNION, UNION ALL, AUßER ÜBERSCHNEIDEN |
| Mehrere ORDER BY-Spalten | Sortieren nach Entfernung, dann nach Datum oder Titel |
| EINDEUTIG | Entfernen doppelter Ergebnisse |
| CROSS APPLY | Anwenden der Vektorsuche pro Zeile aus der äußeren Tabelle |
GROUP BY- und Aggregatfunktionen
Im folgenden Beispiel wird der durchschnittliche Abstand der Artikel nach Kategorie gefunden. In diesem Beispiel wurde der wikipedia_articles Tabelle eine category Spalte hinzugefügt, um Artikel zu klassifizieren.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);
SELECT
category,
COUNT(*) AS article_count,
AVG(distance) AS avg_distance,
MIN(distance) AS closest_match
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
GROUP BY category
ORDER BY avg_distance;
Fensterfunktionen
Im folgenden Beispiel werden Artikel nach Ähnlichkeit bewertet und Quartile zugewiesen.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'neural networks' USE MODEL Ada2Embeddings);
SELECT
id,
title,
category,
distance,
ROW_NUMBER() OVER (ORDER BY distance) AS rank,
NTILE(4) OVER (ORDER BY distance) AS quartile
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
WHERE distance < 0.5
ORDER BY rank;
Festlegen von Vorgängen (UNION, INTERSECT, EXCEPT)
Im folgenden Beispiel werden Ergebnisse aus zwei verschiedenen Suchabfragen mithilfe von UNION kombiniert.
DECLARE @qv1 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
DECLARE @qv2 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);
SELECT id, title, 'AI Search' AS source
FROM (
SELECT TOP (50) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv1,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS ai_results
UNION
SELECT id, title, 'ML Search' AS source
FROM (
SELECT TOP (50) WITH APPROXIMATE
t.id,
t.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv2,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS ml_results
ORDER BY id;
EINDEUTIG
Im folgenden Beispiel werden unterschiedliche Kategorien von artikeln mit den wichtigsten Übereinstimmungen abgerufen.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'deep learning' USE MODEL Ada2Embeddings);
SELECT DISTINCT category
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
WHERE distance < 0.7
ORDER BY category;
Mehrere ORDER BY-Spalten
Im folgenden Beispiel wird nach Entfernung und dann nach Titel für Bindungen sortiert.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'quantum computing' USE MODEL Ada2Embeddings);
SELECT
id,
title,
category,
distance
FROM (
SELECT TOP (100) WITH APPROXIMATE
t.id,
t.title,
t.category,
r.distance
FROM VECTOR_SEARCH(
TABLE = dbo.wikipedia_articles AS t,
COLUMN = title_vector,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vector_results
ORDER BY distance, title;
CROSS APPLY
Bei Verwendung SELECT TOP (N) WITH APPROXIMATE mit VECTOR_SEARCH, können Sie diese Klausel nicht verwenden oder OUTER APPLY in derselben FROM Klausel verwendenCROSS APPLY. Dies gilt auch dann, wenn innerhalb der VECTOR_SEARCH Funktion kein äußerer Bezug vorhanden ist.
Eine Abfrage mit CROSS APPLY würde logisch mehrere Vektorsuchen (eine pro Zeile aus der äußeren Tabelle) ausführen und alle Ergebnisse in einem einzigen sortierten Datenstrom zusammenführen. Der ungefähre Nachbaralgorithmus kann ergebnisse aus mehreren unabhängigen Vektorsuchen nicht effizient zusammenführen und gleichzeitig die ungefähren Garantien und Leistungsmerkmale beibehalten.
Muster, das einen Fehler erzeugt:
-- This query is NOT supported
SELECT TOP (100) WITH APPROXIMATE
o.id,
vs.title,
vs.distance
FROM Orders AS o
CROSS APPLY VECTOR_SEARCH(
TABLE = Products,
COLUMN = embedding,
SIMILAR_TO = o.customer_preference_vector,
METRIC = 'cosine'
) AS vs
WHERE o.order_date > '2026-01-01'
ORDER BY vs.distance;
Dieses Muster versucht, ähnliche Produkte für die Kundenpräferenz jeder Bestellung zu finden, kann jedoch nicht mit einem ungefähren Vektorsuchplan ausgeführt werden.
Empfohlenes Muster:
Um ähnliche Ergebnisse zu erzielen, verwenden Sie eine Unterabfrage in TOP (N) WITH APPROXIMATE sich CROSS APPLY selbst:
-- This query IS supported
SELECT
o.id,
vs.title,
vs.distance
FROM Orders AS o
CROSS APPLY (
SELECT TOP (10) WITH APPROXIMATE
p.title,
r.distance
FROM VECTOR_SEARCH(
TABLE = Products AS p,
COLUMN = embedding,
SIMILAR_TO = o.customer_preference_vector,
METRIC = 'cosine'
) AS r
ORDER BY r.distance
) AS vs
WHERE o.order_date > '2026-01-01';
In diesem Muster:
- Jede Vektorsuche ist auf die obersten 10 Ergebnisse innerhalb der Unterabfrage beschränkt.
- Die äußere Abfrage wird nicht verwendet.
WITH APPROXIMATE - Die Ergebnisse sind pro Zeile aus der äußeren Tabelle ordnungsgemäß bereichsbezogen.
Vorgänge, die direkt funktionieren
Die folgenden Vorgänge können direkt verwendet VECTOR_SEARCH werden, ohne dass eine Unterabfrage erforderlich ist:
- INNER JOIN - Siehe Beispiel D: Multi-Table Joins mit INNER JOIN
- WHERE-Prädikate – Iterative oder Nachfilterung anwenden
- EinzelREIHENFOLGE NACH Entfernung