Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: SQL Server 2025 (17.x)
Azure SQL Database
SQL database in Microsoft Fabric
Vyhledejte vektory podobné danému vektoru dotazu pomocí přibližného algoritmu vektorového vyhledávání nejbližších sousedů. Další informace o tom, jak funguje vektorové indexování a vektorové vyhledávání, a rozdíly mezi přesným a přibližným vyhledáváním najdete v tématu Vektorové vyhledávání a vektorové indexy v databázovém stroji SQL.
Azure SQL Database a databáze SQL ve službě Fabric
Funkce je v náhledu. Než je začnete používat, nezapomeňte si prohlédnout aktuální omezení .
Poznámka:
Jako funkce ve verzi Preview platí, že technologie uvedená v tomto článku podléhá dodatečným podmínkám použití pro verze Microsoft Azure Preview.
Důležité
K zajištění optimálního výkonu a přístupu k nejnovějším funkcím vyhledávání vektorů použijte vektorové indexy vytvořené s nejnovější verzí. Další informace o upgradu existujících indexů a porovnávání verzí naleznete v tématu CREATE VECTOR INDEX – Upgrade vektorových indexů na nejnovější verzi.
Regionální dostupnost
Tato funkce se nasazuje napříč Azure SQL Database a databází SQL v Microsoft Fabric. Během zavádění se dostupnost a chování můžou lišit podle oblasti a verze indexu. Pokud funkce nebo syntaxe není dostupná, bude dostupná automaticky po dokončení nasazení. Aktuální stav dostupnosti v jednotlivých oblastech najdete v tématu Dostupnost funkcí v jednotlivých oblastech.
Výstraha
Oznámení o vyřazení: Parametr TOP_N je VECTOR_SEARCH zastaralý a udržuje se pouze kvůli zpětné kompatibilitě s indexy vektorů starší verze. Nové implementace by měly místo toho používat SELECT TOP (N) WITH APPROXIMATE syntaxi. Další informace najdete v tématu Syntaxe.
Funkce Preview SQL Server 2025
V SQL Server 2025 je tato funkce v náhledu a může se změnit. Chcete-li použít tuto funkci, musíte povolit PREVIEW_FEATURES databáze.
Než je začnete používat, nezapomeňte si prohlédnout aktuální omezení .
Poznámka:
Nejnovější verze vektorových indexů je v současné době dostupná pouze v Azure SQL Database a v databázi SQL v Microsoft Fabric.
Klíčová vylepšení s nejnovějšími vektorovými indexy
Vektorové indexy vytvořené s nejnovější verzí přinášejí významná vylepšení:
- Úplná podpora DML: Odebere předchozí omezení, které po vytvoření indexu indexovaly vektorové tabulky jen pro čtení. Nyní můžete provádět operace INSERT, UPDATE, DELETE a MERGE při zachování funkčnosti vektorového indexu s automatickou údržbou indexu v reálném čase.
- Iterativní filtrování: Predikáty v klauzuli WHERE se použijí během procesu hledání vektorů, ne po načtení.
- Optimalizátor řízený: Optimalizátor dotazů automaticky určuje, jestli se má použít index DiskANN nebo vyhledávání kNN na základě charakteristik dotazu.
- Pokročilá kvantování: Techniky kvantování vektorů byly integrované, aby poskytovaly lepší efektivitu úložiště a rychlejší výkon dotazů. Tyto optimalizace jsou pro uživatele transparentní.
Syntax
S nejnovější verzí Vector Indexy:
Důležité
Při dotazování tabulek, které používají nejnovější verzi indexu vektoru, musí přibližné hledání vektoru použít syntaxi TOP (N). Tento požadavek na syntaxi označuje, že dotaz explicitně požaduje přibližné výsledky nejbližšího souseda.
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;
S dřívější verzí Vector Indexy:
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 ]
Důležité
Parametr TOP_N není podporován s nejnovějšími indexy vektorů verzí. Použijte syntaxi SELECT TOP (N) WITH APPROXIMATE uvedenou výše. Další informace naleznete v tématu Chyba při použití starší syntaxe.
Arguments
TABLE = objekt [AS source_table_alias]
Tabulka, na které se provádí hledání Musí to být základní tabulka. Zobrazení, dočasné tabulky, místní i globální, se nepodporují.
SLOUPEC = vector_column
Vektorový sloupec, ve kterém se vyhledávání provádí. Sloupec musí být datový typ vektoru .
SIMILAR_TO = query_vector
Vektor použitý k hledání. Musí to být proměnná nebo sloupec typu vektoru .
METRIC = { 'kosinus' | 'tečka' | 'euclidean' }
Metrika vzdálenosti použitá k výpočtu vzdálenosti mezi vektorem dotazu a vektory v zadaném sloupci. Index ANN (Přibližný nejbližší soused) se používá pouze v případě, že se najde odpovídající index ANN se stejnou metrikou a ve stejném sloupci. Pokud nejsou k dispozici žádné kompatibilní indexy ANN, vyvolá se upozornění a použije se algoritmus kNN (k-nejbližší soused).
TOP_N = <k>
Výstraha
Tento parametr je zastaralý a udržuje se pouze kvůli zpětné kompatibilitě s indexy vektorů starší verze. Pro indexy nejnovějších verzí použijte SELECT TOP (N) WITH APPROXIMATE místo toho syntaxi. Nové implementace by měly používat nejnovější syntaxi.
Maximální počet podobných vektorů, které musí být vráceny. Musí to být kladné celé číslo. Tento parametr není podporován u vektorových indexů vytvořených pomocí nejnovější verze.
result_table_alias
Alias se používá k odkazu na sadu výsledků.
Vrácená sada výsledků
Sada výsledků vrácená VECTOR_SEARCH funkcí zahrnuje:
Všechny sloupce z tabulky zadané v argumentu
TABLEDalší sloupec s názvem
distance, který představuje vzdálenost mezi vektorem ve sloupci určenémCOLUMNargumentem a vektorem zadaným v argumentuSIMILAR_TO.
Sloupec vzdálenosti je generován VECTOR_SEARCH samotnou funkcí, zatímco všechny ostatní sloupce pocházejí z tabulky odkazované v argumentu TABLE .
Pokud v argumentu TABLE použijete alias pro tabulku, musíte stejný alias použít k odkazování na jeho sloupce v SELECT příkazu. Alias přiřazený k VECTOR_SEARCH odkazovaným sloupcům z tabulky zadané v TABLEtabulce nemůžete použít. Toto chování je jednodušší pochopit, pokud si myslíte, že sada výsledků sestavená tak, že vezme výstup VECTOR_SEARCH a sloučí se daty tabulky.
Pokud tabulka zadaná v argumentu TABLE již obsahuje sloupec s názvem distance, bude chování podobné spojení SQL mezi dvěma tabulkami, které sdílejí název sloupce. V takových případech je nutné použít aliasy tabulky k nejednoznačnosti odkazů na sloupce – jinak se vyvolá chyba.
Důležité
Sloupec distance je jediný platný klíč řazení pro přibližné výsledky hledání vektorů.
Limitations
-
Pouze vzestupné pořadí:
distanceSloupec musí být seřazen ve vzestupném pořadí (ASC). Sestupné pořadí (DESC) není podporováno.
Chování specifické pro konkrétní verzi
Chování VECTOR_SEARCH se liší v závislosti na verzi vektorového indexu.
Starší verze indexu vektoru
Poznámka:
Tato omezení platí pouze pro vektorové indexy vytvořené v dřívějších verzích. Pokud chcete povolit iterativní filtrování, proveďte migraci na nejnovější verzi. Viz Migrace ze starších verzí vektorového indexu.
Pouze následné filtrování: Hledání vektorů probíhá před použitím jakéhokoli predikátu. Další predikáty se použijí až po vrácení většiny podobných vektorů. Následující ukázka vrátí prvních 10 řádků s vkládáním, které jsou nejvíce podobné vektoru @qvdotazu , pak použije predikát zadaný v WHERE klauzuli. Pokud žádný z 10 řádků přidružených k vektorům vráceným vektorovým vyhledáváním nemá accepted sloupec rovnající se 1, výsledek je prázdný.
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;
Obecná omezení
VECTOR_SEARCH nelze použít v textu zobrazení.
Examples
A. Hledání základní podobnosti vektorů
Důležité
Při dotazování tabulek, které používají nejnovější verzi indexu vektoru, musí syntaxi použít přibližné hledání vektorů TOP (N) WITH APPROXIMATE . Tento požadavek na syntaxi označuje, že dotaz explicitně požaduje přibližné výsledky nejbližšího souseda.
Následující příklad najde 10 nejpodobnějších článků Pink Floyd music style v wikipedia_articles_embeddings tabulce.
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;
Syntaxe pro dotazování závisí na verzi vektorového indexu:
| Verze vektorových indexů | Příklad syntaxe |
|---|---|
| Nejnovější verze | Použít SELECT TOP (N) WITH APPROXIMATE bez TOP_N parametru |
| Starší verze (zastaralé) | Použití TOP_N parametru ve VECTOR_SEARCH funkci |
Návod
Informace o určení verze vektorového indexu najdete v tématu Migrace z dřívějších verzí vektorového indexu.
Pro indexy starších verzí (zastaralá syntaxe):
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;
Poznámka:
Použití parametru TOP_N s nejnovějšími indexy vektorů verzí vrátí chybu Msg 42274. Podrobné informace naleznete v tématu Chyba při použití starší syntaxe v části Očekávané chování.
B. Dokončení pracovního postupu s vytvořením indexu
Základní kompletní příklad použití CREATE VECTOR INDEX a související VECTOR_SEARCH funkce. Vložené kódy jsou napodobeny. Ve skutečném scénáři se vkládání generují pomocí modelu vkládání a AI_GENERATE_EMBEDDINGS nebo externí knihovny, jako je OpenAI SDK.
Poznámka:
Nejnovější indexy vektorů verzí před vytvořením indexu vyžadují alespoň 100 řádků dat. Tento příklad vloží 100 řádků, aby tento požadavek splňoval. Další informace najdete v tématu Minimální požadavky na data.
Následující blok kódu demonstruje VECTOR_SEARCH funkci se napodobenými vkládáními:
- Povolí funkci Preview (vyžaduje se jenom pro SQL Server 2025, není nutná pro Azure SQL Database nebo databázi SQL v prostředcích infrastruktury).
- Vytvořte ukázkovou tabulku
dbo.Articlesse sloupcemembeddings vektorem datového typu(5). - Vloží 100 řádků ukázkových dat s napodobenými vloženými daty.
- Vytvořte vektorový index na
dbo.Articles.embedding. - Předveďte hledání vektorové podobnosti pomocí
VECTOR_SEARCHfunkce.
-- 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;
Syntaxe pro dotazování závisí na verzi vektorového indexu:
| Verze vektorových indexů | Příklad syntaxe |
|---|---|
| Nejnovější verze | Použít SELECT TOP (N) WITH APPROXIMATE bez TOP_N parametru |
| Starší verze (zastaralé) | Použití TOP_N parametru ve VECTOR_SEARCH funkci |
Pro indexy starších verzí (zastaralá syntaxe):
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. Vektorové vyhledávání s iterativním filtrováním
Následující příklad ukazuje iterativní filtrování s nejnovějšími indexy vektorů verzí. Dotaz najde podobné články při použití predikátů během procesu hledání.
S nejnovějšími indexy verzí se predikáty v klauzuli WHERE použijí během procesu vektorového vyhledávání (ne po). Modul pokračuje v hledání, dokud nenajde 5 opravňujících řádků, které odpovídají všem kritériím:
- Vektorová podobnost s "algoritmy strojového učení"
- Kategorie se rovná technologii
- Publikovaný stav se rovná 1
Tím zajistíte, že získáte přesně 5 výsledků (pokud existují) bez ručního ladění parametrů hledání. Podrobné porovnání starších a nejnovějších verzí najdete v části Očekávané chování filtrování v iterativním filtrování .
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;
Poznámka:
Některé operace SQL, jako je GROUP BY, agregační funkce a funkce oken, vyžadují vzor poddotazů. Podrobnosti najdete v tématu Kombinování vektorové vyhledávání s jinými operacemi SQL.
D. Spojení s více tabulkami pomocí funkce INNER JOIN
Následující ukázka ukazuje INNER JOIN s filtrováním na více tabulkách. Slouží k ukládání v samostatných tabulkách od dat hlavní entity.
-- 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;
Klíčové funkce tohoto příkladu:
-
Obor aliasu tabulky: Alias
efromTABLE = wikipedia_articles_embeddings AS eje k dispozici v klauzuli WHERE pro iterativní filtrování s využitím indexů nejnovějších verzí.
Očekávané chování
Chyba při použití starší syntaxe
Pokud se pokusíte použít TOP_N parametr při VECTOR_SEARCH dotazování tabulky s nejnovějším indexem vektoru verze, sql Server vrátí následující chybu:
Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.
Řešení této chyby:
-
TOP_NOdebrání parametruVECTOR_SEARCHz funkce - Místo toho použijte syntaxi.
SELECT TOP (N) WITH APPROXIMATE
Nesprávná (generuje chybu s indexem nejnovější verze):
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;
Správně (funguje s indexem nejnovější verze):
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;
Chování iterativního filtrování
Nejnovější verze přináší významná vylepšení oproti dřívějším verzím indexu vektorů:
| Aspekt | Starší verze | Nejnovější verze |
|---|---|---|
| Predikát aplikace | Relační predikáty se použily po hledání vektorů s pevným počtem nejbližších sousedů (pouze po filtrování). | Relační predikáty se použijí během procesu hledání vektorů (iterativní filtrování). |
| Úplnost výsledku | Dotazy by mohly vrátit méně řádků (nebo žádné řádky), pokud počáteční nejbližší sousedé nesplňují filtry, i když existovaly opravňující řádky. | Dotazy vrátí očekávaný počet řádků, pokud existují kvalifikující data, bez ručního ladění nebo přepsání dotazů. |
| Ladění TOP (N) | Uživatelé často museli odhadovat nebo převzorkovat hodnoty TOP (N), aby mohli kompenzovat následné filtrování. | Není nutné hádat hodnoty TOP (N). Modul vyhledává, dokud se nenajde dostatek opravňujících řádků nebo se nevyčerpá vyhledávací prostor. |
| Optimalizace dotazů | Není relevantní | SQL Server automaticky vybere nejúčinnější strategii provádění, včetně přepínání mezi hledáním vektorového indexu a kontrol kNN, pokud je to vhodné. |
Praktický příklad iterativního filtrování najdete v příkladu C: Vektorové vyhledávání s iterativním filtrováním.
Požadavky klauzule ORDER BY
Při použití SELECT TOP (N) WITH APPROXIMATEmá klauzule ORDER BY specifické požadavky:
- ORDER BY musí existovat: Dotazy bez klauzule ORDER BY selžou s chybou .
- Povolen pouze sloupec vzdálenosti: Klauzule ORDER BY musí odkazovat pouze na sloupec vzdálenosti ze sady výsledků VECTOR_SEARCH. Zahrnutí dalších sloupců selže s chybou. Pokud chcete řadit podle více sloupců, použijte vzor poddotazů popsaný ve sloupcích Multiple ORDER BY.
- Pouze vzestupné pořadí: Sloupec vzdálenosti musí být seřazen ve vzestupném pořadí (ASC). Sestupné pořadí (DESC) není podporováno.
Platnost ORDER BY:
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
Neplatné vzory ORDER BY:
-- 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
Chování bez vektorového indexu
VECTOR_SEARCH může spouštět dotazy, i když v cílovém sloupci neexistuje žádný vektorový index. Bez indexu dotaz provede úplnou kontrolu tabulky (hledání k-nejbližšího souseda kNN) pro výpočet vzdáleností pro všechny řádky.
Chování dotazu bez funkce TOP WITH APPROXIMATE
Při použití VECTOR_SEARCH bez SELECT TOP (N) WITH APPROXIMATE, chování dotazu závisí na přítomnosti TOP a ORDER BY klauzulích:
- No TOP, no ORDER BY, or ORDER BY non-distance: Full table scan (brute-force search) that calculates and returns distances for all rows
- TOP (no APPROXIMATE) with ORDER BY distance: Provádí se jako hledání kNN (k-nejbližší sousedé), což je přesné hledání nejbližšího souseda.
Příklad – úplná kontrola se sloupcem vzdálenosti:
-- 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
Příklad – hledání kNN (přesné nejbližší sousedy):
-- 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 without VECTOR_SEARCH
Použití SELECT TOP (N) WITH APPROXIMATE bez VECTOR_SEARCH funkce v dotazu způsobí chybu. Klauzule WITH APPROXIMATE vyžaduje, VECTOR_SEARCH aby byla k dispozici funkce.
Nesprávná odpověď – tento dotaz selže:
-- 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);
Správně – použijte 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;
Omezení TABULKY TRUNCATE
Tabulky s vektorovými indexy nelze zkrátit pomocí TRUNCATE TABLE. Odebrání všech dat z tabulky indexované vektorem:
- Přetažení vektorového indexu
- Zkrácení tabulky
- Znovu zaplňte tabulku alespoň 100 řádky.
- Opětovné vytvoření vektorového indexu
Ukázkový pracovní postup:
-- 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');
Rady k tabulce pro vektorové vyhledávání
Pomocí nápovědy k tabulce s VECTOR_SEARCH funkcí můžete řídit chování provádění dotazů. Tip FORCE_ANN_ONLY tabulky vynutí optimalizaci dotazů použít pouze přibližný index nejbližšího souseda (ANN), i když optimalizátor může jinak zvolit jinou strategii provádění.
Syntaxe:
FROM VECTOR_SEARCH(
TABLE = table_name,
COLUMN = column_name,
SIMILAR_TO = vector_value,
METRIC = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)
Příklad:
Následující příklad vynutí použití přibližného indexu nejbližšího souseda pro dotaz vektorového vyhledávání:
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;
Pokud FORCE_ANN_ONLY chcete zajistit, aby dotaz používal přibližnou strategii indexu nejbližšího souseda, přepisuje automatický výběr strategie optimalizátoru.
Poznámka:
Použití FORCE_ANN_ONLY vyžaduje obojí:
- Vektorový index v cílovém sloupci
-
SELECT TOP (N) WITH APPROXIMATEv dotazu
Pokud některý z požadavků chybí, dotaz selže, protože nemůže použít přibližnou strategii nejbližšího souseda, kterou tip vynutí.
Kombinování vektorového vyhledávání s jinými operacemi SQL
Funkce VECTOR_SEARCH s konkrétními TOP (N) WITH APPROXIMATE požadavky na využití. Některé operace SQL je možné použít přímo s vektorovým vyhledáváním, zatímco jiné vyžadují vzor poddotazů.
Operace, které vyžadují vzor poddotazů
Pokud potřebujete provádět operace, které nejsou přímo kompatibilní TOP (N) WITH APPROXIMATE, použijte vektorové vyhledávání v poddotadu (vnitřní dotaz) a pak použijte operace ve vnějším dotazu. Tento model zachovává výhody výkonu přibližného vektorového vyhledávání při povolování všech funkcí SQL.
Návod
Vzor poddotazů funguje pro jakoukoli operaci, která se nedá kombinovat přímo s TOP (N) WITH APPROXIMATE. Použití vektorového vyhledávání ve vnitřním dotazu a následné použití jakékoli operace SQL ve vnějším dotazu.
Obvyklé scénáře
Následující tabulka uvádí operace, které vyžadují vzor poddotazů:
| Operation | Příklad případu použití |
|---|---|
| SESKUPIT PODLE | Výpočet statistiky na kategorii |
| Agregační funkce | Overall COUNT, AVG, MIN, MAX napříč výsledky |
| Funkce okna | ROW_NUMBER, RANK, DENSE_RANK, NTILE |
| Nastavení operací | UNION, UNION ALL, EXCEPT, INTERSECT |
| Více sloupců ORDER BY | Seřadit podle vzdálenosti a potom podle data nebo názvu |
| ODLIŠNÝ | Odebrání duplicitních výsledků |
| KŘÍŽOVÉ POUŽITÍ | Použití vektorového hledání na řádek z vnější tabulky |
GROUP BY a agregační funkce
Následující příklad najde průměrnou vzdálenost nejlepších odpovídajících článků podle kategorie. V tomto příkladu category byl sloupec přidán do wikipedia_articles tabulky pro klasifikaci článků.
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;
Funkce okna
Následující příklad řadí články podle podobnosti a přiřazuje kvartily.
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;
Nastavení operací (UNION, INTERSECT, EXCEPT)
Následující příklad kombinuje výsledky ze dvou různých vyhledávacích dotazů pomocí union.
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;
ODLIŠNÝ
Následující příklad získá odlišné kategorie od nejlepších odpovídajících článků.
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;
Více sloupců ORDER BY
Následující příklad seřadí podle vzdálenosti a potom podle názvu pro vazby.
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;
KŘÍŽOVÉ POUŽITÍ
Při použití s VECTOR_SEARCHSELECT TOP (N) WITH APPROXIMATE , nemůžete použít CROSS APPLY nebo OUTER APPLY ve stejné FROM klauzuli. To platí i v případě, že v rámci VECTOR_SEARCH funkce neexistuje žádný vnější odkaz.
Dotaz s logickým provedením CROSS APPLY více vektorových vyhledávání (jeden na řádek z vnější tabulky) a sloučit všechny výsledky do jednoho seřazeného datového proudu. Přibližný algoritmus nejbližšího souseda nemůže efektivně sloučit výsledky z více nezávislých vektorových hledání při zachování přibližných záruk a charakteristik výkonu.
Vzor, který generuje chybu:
-- 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;
Tento vzor se snaží najít podobné produkty pro každou objednávku podle preferencí zákazníka, ale nedá se spustit s plánem přibližného vektorového vyhledávání.
Doporučený vzor:
Pokud chcete dosáhnout podobných výsledků, použijte poddotaz se TOP (N) WITH APPROXIMATE samotným CROSS APPLY :
-- 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';
V tomto vzoru:
- Každé hledání vektorů je omezené na prvních 10 výsledků v poddotadu.
- Vnější dotaz se nepoužívá.
WITH APPROXIMATE - Výsledky jsou správně vymezeny na každý řádek z vnější tabulky.
Operace, které pracují přímo
Následující operace je možné použít přímo bez VECTOR_SEARCH nutnosti poddotazů:
- INNER JOIN – viz příklad D: Spojení s více tabulkami pomocí INNER JOIN
- Predikáty WHERE – použití iterativního nebo následného filtrování
- Jedna vzdálenost ORDER BY