Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do: SQL Server 2025 (17.x)
Azure SQL Database
SQL database in Microsoft Fabric
Wyszukaj wektory podobne do danych wektorów zapytań przy użyciu przybliżonego algorytmu wyszukiwania wektorów najbliższych sąsiadów. Aby dowiedzieć się więcej o tym, jak działa indeksowanie wektorów i wyszukiwanie wektorów oraz różnice między dokładnym i przybliżonym wyszukiwaniem, zapoznaj się z indeksami wyszukiwania wektorowego i wektorów w a aparatu bazy danych SQL.
Usługa Azure SQL Database i baza danych SQL w Fabric
Funkcja jest dostępna w wersji podglądowej. Przed rozpoczęciem korzystania z niego zapoznaj się z bieżącymi ograniczeniami .
Uwaga / Notatka
Jako funkcja w wersji zapoznawczej technologia przedstawiona w tym artykule podlega dodatkowym warunkom użytkowania dla wersji zapoznawczych platformy Microsoft Azure.
Ważna
Aby uzyskać optymalną wydajność i uzyskać dostęp do najnowszych możliwości wyszukiwania wektorów, użyj indeksów wektorów utworzonych przy użyciu najnowszej wersji. Aby uzyskać więcej informacji na temat uaktualniania istniejących indeksów i porównywania wersji, zobacz CREATE VECTOR INDEX — uaktualnij indeksy wektorów do najnowszej wersji.
Dostępność regionalna
Ta funkcja jest wdrażana w usłudze Azure SQL Database i bazie danych SQL Database w usłudze Microsoft Fabric. Podczas wdrażania dostępność i zachowanie mogą się różnić w zależności od regionu i wersji indeksu. Jeśli funkcja lub składnia nie jest dostępna, stanie się ona dostępna automatycznie po zakończeniu wdrażania. Aby uzyskać informacje o bieżącym stanie dostępności regionalnej, zobacz Dostępność funkcji według regionów.
Ostrzeżenie
Powiadomienie o wycofaniu: TOP_N parametr w pliku VECTOR_SEARCH jest przestarzały i utrzymywany tylko w celu zapewnienia zgodności z poprzednimi wersjami indeksów wektorów wersji. W zamian nowe implementacje powinny używać SELECT TOP (N) WITH APPROXIMATE składni. Aby uzyskać więcej informacji, zobacz Składnia.
Funkcja podglądowa SQL Server 2025
W SQL Server 2025 funkcja ta jest w podglądzie i może ulec zmianie. Aby móc korzystać z tej funkcji, należy włączyć konfigurację PREVIEW_FEATURESw zakresie bazy danych.
Przed rozpoczęciem korzystania z niego zapoznaj się z bieżącymi ograniczeniami .
Uwaga / Notatka
Najnowsza wersja indeksów wektorów jest obecnie dostępna tylko w usłudze Azure SQL Database i bazie danych SQL w usłudze Microsoft Fabric.
Najważniejsze ulepszenia dotyczące najnowszych indeksów wektorów
Indeksy wektorowe utworzone przy użyciu najnowszej wersji wprowadzają znaczące ulepszenia:
- Pełna obsługa języka DML: usuwa poprzednie ograniczenie, które sprawiło, że tabele indeksowane wektorowo tylko do odczytu po utworzeniu indeksu. Teraz można wykonywać operacje INSERT, UPDATE, DELETE i MERGE przy zachowaniu funkcji indeksu wektorowego z automatyczną konserwacją indeksu w czasie rzeczywistym
- Filtrowanie iteracyjne: Predykaty w klauzuli WHERE są stosowane podczas procesu wyszukiwania wektorowego, a nie po pobraniu
- Optymalizator sterowany: optymalizator zapytań automatycznie określa, czy używać indeksu DiskANN, czy wyszukiwania kNN na podstawie cech zapytania
- Zaawansowane kwantyzacja: techniki kwantyzacji wektorów zostały zintegrowane w celu zapewnienia lepszej wydajności magazynowania i szybszej wydajności zapytań, a te optymalizacje są niewidoczne dla użytkowników
Syntax
Transact-SQL konwencje składni
Przy użyciu najnowszych wersji indeksów wektorów:
Ważna
Podczas wykonywania zapytań dotyczących tabel używających najnowszej wersji indeksu wektorowego przybliżona funkcja wyszukiwania wektorowego musi używać składni TOP (N) APPROXIMATE. To wymaganie składni wskazuje, że zapytanie jawnie żąda przybliżonych wyników najbliższego sąsiada.
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;
W przypadku wcześniejszych wersji indeksów wektorów:
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 ]
Ważna
Parametr TOP_N nie jest obsługiwany w przypadku najnowszych indeksów wektorów wersji. Użyj składni pokazanej SELECT TOP (N) WITH APPROXIMATE powyżej. Aby uzyskać więcej informacji, zobacz Błąd przy użyciu starszej składni.
Arguments
TABELA = obiekt [JAK source_table_alias]
Tabela, na której jest wykonywane wyszukiwanie. Musi to być tabela podstawowa. Widoki, tabele tymczasowe, zarówno lokalne, jak i globalne, nie są obsługiwane.
KOLUMNA = vector_column
Kolumna wektorowa, w której jest wykonywane wyszukiwanie. Kolumna musi być typem danych wektorowych .
SIMILAR_TO = query_vector
Wektor używany do wyszukiwania. Musi to być zmienna lub kolumna typu wektora .
METRIC = { 'cosine' | 'dot' | "euclidean" }
Metryka odległości używana do obliczania odległości między wektorem zapytania a wektorami w określonej kolumnie. Indeks ANN (Przybliżony najbliższy sąsiad) jest używany tylko wtedy, gdy zostanie znaleziony pasujący indeks ANN z tą samą metryką i w tej samej kolumnie. Jeśli nie ma żadnych zgodnych indeksów ANN, zostanie zgłoszone ostrzeżenie i zostanie użyty algorytm kNN (k najbliższego sąsiada).
TOP_N = <k>
Ostrzeżenie
Ten parametr jest przestarzały i utrzymywany tylko w celu zapewnienia zgodności z poprzednimi wersjami indeksów wektorów wersji. W przypadku najnowszych indeksów wersji użyj SELECT TOP (N) WITH APPROXIMATE składni. Nowe implementacje powinny używać najnowszej składni.
Maksymalna liczba podobnych wektorów, które muszą być zwracane. Musi to być dodatnia liczba całkowita. Ten parametr nie jest obsługiwany w przypadku indeksów wektorów utworzonych przy użyciu najnowszej wersji.
result_table_alias
Alias jest używany do odwołowania się do zestawu wyników.
Zwracanie zestawu wyników
Zestaw wyników zwracany przez VECTOR_SEARCH funkcję obejmuje:
Wszystkie kolumny z tabeli określonej w argumencie
TABLE.Dodatkowa kolumna o nazwie
distance, która reprezentuje odległość między wektorem w kolumnie określonej przezCOLUMNargument i wektor podany w argumencieSIMILAR_TO.
Kolumna odległości jest generowana przez VECTOR_SEARCH samą funkcję, podczas gdy wszystkie inne kolumny pochodzą z tabeli, do których TABLE odwołuje się argument .
Jeśli używasz aliasu dla tabeli w argumencie TABLE , musisz użyć tego samego aliasu, aby odwołać się do jego kolumn w instrukcji SELECT . Nie można użyć aliasu przypisanego do do odwołań do VECTOR_SEARCH kolumn z tabeli określonej w pliku TABLE. To zachowanie jest łatwiejsze do zrozumienia, jeśli myślisz o zestawie wyników utworzonym przez pobranie danych wyjściowych VECTOR_SEARCH i scalenie go z danymi tabeli.
Jeśli tabela określona w TABLE argumencie zawiera już kolumnę o nazwie distance, zachowanie będzie podobne do sprzężenia SQL między dwiema tabelami, które współużytkują nazwę kolumny. W takich przypadkach należy użyć aliasów tabeli, aby uściślić odwołania do kolumn — w przeciwnym razie zostanie zgłoszony błąd.
Ważna
Kolumna distance jest jedynym prawidłowym kluczem porządkowania dla przybliżonych wyników wyszukiwania wektorów.
Limitations
-
Tylko kolejność rosnąca: kolumna
distancemusi być uporządkowana w kolejności rosnącej (ASC). Kolejność malejąca (DESC) nie jest obsługiwana.
Zachowanie specyficzne dla wersji
Zachowanie zmiennej VECTOR_SEARCH zależy od wersji indeksu wektorowego.
Wcześniejsze wersje indeksów wektorów
Uwaga / Notatka
Te ograniczenia dotyczą tylko indeksów wektorów utworzonych we wcześniejszych wersjach. Przeprowadź migrację do najnowszej wersji, aby włączyć filtrowanie iteracyjne. Zobacz Migrowanie z wcześniejszych wersji indeksu wektorowego.
Tylko filtrowanie końcowe: wyszukiwanie wektorów odbywa się przed zastosowaniem dowolnego predykatu. Dodatkowe predykaty są stosowane tylko po zwracaniu najbardziej podobnych wektorów. Poniższy przykład zwraca 10 pierwszych wierszy z osadzanymi najbardziej podobnymi do wektora @qvzapytania , a następnie stosuje predykat określony w klauzuli WHERE . Jeśli żadna z 10 wierszy skojarzonych z wektorami zwróconymi przez wyszukiwanie wektorowe ma kolumnę accepted równą 1, wynik jest pusty.
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;
Ogólne ograniczenia
VECTOR_SEARCH Nie można jej używać w treści widoku.
Examples
Odp. Wyszukiwanie podobieństwa wektorów podstawowych
Ważna
Podczas wykonywania zapytań dotyczących tabel używających najnowszej wersji indeksu wektorowego przybliżone wyszukiwanie wektorów musi używać TOP (N) WITH APPROXIMATE składni. To wymaganie składni wskazuje, że zapytanie jawnie żąda przybliżonych wyników najbliższego sąsiada.
W poniższym przykładzie znaleziono 10 najbardziej podobnych artykułów do Pink Floyd music style w wikipedia_articles_embeddings tabeli.
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;
Składnia wykonywania zapytań zależy od wersji indeksu wektorowego:
| Wersja indeksu wektorowego | Przykład składni |
|---|---|
| Najnowsza wersja | Użyj SELECT TOP (N) WITH APPROXIMATE bez TOP_N parametru |
| Wcześniejsze wersje (przestarzałe) | Używanie TOP_N parametru w VECTOR_SEARCH funkcji |
Wskazówka
Aby określić wersję indeksu wektorowego, zobacz Migrowanie z wcześniejszych wersji indeksu wektorowego.
W przypadku wcześniejszych indeksów wersji (składnia przestarzała):
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;
Uwaga / Notatka
Użycie parametru TOP_N z najnowszymi indeksami wektorów wersji zwraca błąd Msg 42274. Aby uzyskać szczegółowe informacje, zobacz Błąd przy użyciu starszej składni w sekcji Oczekiwane zachowania.
B. Ukończ przepływ pracy z tworzeniem indeksu
Podstawowy przykład kompleksowego użycia CREATE VECTOR INDEX i powiązanej VECTOR_SEARCH funkcji. Osadzanie są wyśmiewane. W rzeczywistym scenariuszu osadzanie jest generowane przy użyciu modelu osadzania i AI_GENERATE_EMBEDDINGS lub zewnętrznej biblioteki, takiej jak zestaw OpenAI SDK.
Uwaga / Notatka
Najnowsze indeksy wektorów wersji wymagają co najmniej 100 wierszy danych przed utworzeniem indeksu. W tym przykładzie wstawia 100 wierszy, aby spełnić to wymaganie. Aby uzyskać więcej informacji, zobacz Minimalne wymagania dotyczące danych.
Poniższy blok kodu demonstruje VECTOR_SEARCH funkcję z pozornymi osadzaniami:
- Włącza funkcję w wersji zapoznawczej (wymaganą tylko dla programu SQL Server 2025; nie jest wymagana dla usługi Azure SQL Database lub bazy danych SQL Database w usłudze Fabric).
- Utwórz przykładową tabelę
dbo.Articlesz kolumnąembeddingz wektorem typu danych (5). - Wstaw 100 wierszy przykładowych danych z pozorowanym osadzaniem danych.
- Utwórz indeks wektora w pliku
dbo.Articles.embedding. - Demonstruj wyszukiwanie podobieństwa wektorów za pomocą
VECTOR_SEARCHfunkcji .
-- 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;
Składnia wykonywania zapytań zależy od wersji indeksu wektorowego:
| Wersja indeksu wektorowego | Przykład składni |
|---|---|
| Najnowsza wersja | Użyj SELECT TOP (N) WITH APPROXIMATE bez TOP_N parametru |
| Wcześniejsze wersje (przestarzałe) | Używanie TOP_N parametru w VECTOR_SEARCH funkcji |
W przypadku wcześniejszych indeksów wersji (składnia przestarzała):
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. Wyszukiwanie wektorowe z filtrowaniem iteracyjnym
W poniższym przykładzie pokazano iteracyjne filtrowanie przy użyciu najnowszych indeksów wektorów wersji. Zapytanie znajduje podobne artykuły podczas stosowania predykatów podczas procesu wyszukiwania.
W przypadku najnowszych indeksów wersji predykaty w klauzuli WHERE są stosowane podczas procesu wyszukiwania wektorowego (nie po). Aparat kontynuuje wyszukiwanie, dopóki nie znajdzie 5 kwalifikujących się wierszy, które spełniają wszystkie kryteria:
- Podobieństwo wektorów do "algorytmów uczenia maszynowego"
- Kategoria jest równa "Technologia"
- Stan opublikowany to 1
Dzięki temu uzyskasz dokładnie 5 wyników (jeśli istnieją) bez ręcznego dostrajania parametrów wyszukiwania. Aby uzyskać szczegółowe porównanie wcześniejszych i najnowszych wersji, zobacz Iteracyjne zachowanie filtrowania w sekcji Oczekiwane zachowania.
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;
Uwaga / Notatka
Niektóre operacje SQL, takie jak GROUP BY, funkcje agregujące i funkcje okien, wymagają wzorca podzapytania. Aby uzyskać szczegółowe informacje, zobacz Łączenie wyszukiwania wektorów z innymi operacjami SQL.
D. Sprzężenia z wieloma tabelami ze sprzężeniami WEWNĘTRZNYMi
W poniższym przykładzie pokazano sprzężenie WEWNĘTRZNE z filtrowaniem w wielu tabelach. Użyj funkcji podczas osadzania są przechowywane w oddzielnej tabeli od danych jednostki głównej.
-- 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;
Kluczowe funkcje tego przykładu:
-
Zakres aliasu tabeli: alias
ezTABLE = wikipedia_articles_embeddings AS eprogramu jest dostępny w klauzuli WHERE na potrzeby filtrowania iteracyjnego przy użyciu najnowszych indeksów wersji
Oczekiwane zachowania
Błąd podczas korzystania ze starszej składni
Jeśli spróbujesz użyć parametru TOP_N w VECTOR_SEARCH podczas wykonywania zapytania do tabeli z najnowszym indeksem wektorów wersji, program SQL Server zwraca następujący błąd:
Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.
Aby rozwiązać ten błąd:
- Usuwanie parametru
TOP_NVECTOR_SEARCHz funkcji - Zamiast tego użyj
SELECT TOP (N) WITH APPROXIMATEskładni
Niepoprawne (generuje błąd z najnowszym indeksem wersji):
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;
Odpowiedź prawidłowa (działa z najnowszym indeksem wersji):
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;
Zachowanie filtrowania iteracyjnego
Najnowsza wersja wprowadza znaczące ulepszenia wcześniejszych wersji indeksów wektorów:
| Aspekt | Starsza wersja | Najnowsza wersja |
|---|---|---|
| Aplikacja predykatu | Predykaty relacyjne zostały zastosowane po tym, jak wyszukiwanie wektorów zwróciło stałą liczbę najbliższych sąsiadów (tylko po filtrowaniu) | Predykaty relacyjne są stosowane podczas procesu wyszukiwania wektorowego (filtrowanie iteracyjne) |
| Kompletność wyników | Zapytania mogą zwracać mniej wierszy lub nie wierszy, jeśli początkowe najbliższe sąsiady nie spełniają wymagań filtrów, nawet gdy istniały kwalifikujące się wiersze | Zapytania zwracają oczekiwaną liczbę wierszy, gdy istnieją kwalifikujące się dane bez ręcznego dostrajania lub ponownego zapisywania zapytań |
| Dostrajanie TOP (N) | Użytkownicy często musieli odgadnąć lub przerobić wartości TOP (N), aby zrekompensować po filtrowaniu | Nie trzeba odgadywać wartości TOP (N). Aparat wyszukuje do momentu znalezienia wystarczającej liczby kwalifikujących się wierszy lub wyczerpania miejsca wyszukiwania |
| Optymalizacja zapytań | Nie dotyczy | Program SQL Server automatycznie wybiera najbardziej wydajną strategię wykonywania, w tym przełączanie między wyszukiwaniem indeksu wektorowego i skanowaniem kNN w razie potrzeby |
Aby zapoznać się z praktycznym przykładem iteracyjnego filtrowania, zobacz Przykład wyszukiwania Wektorów przy użyciu filtrowania iteracyjnego.
Wymagania klauzuli ORDER BY
W przypadku korzystania z SELECT TOP (N) WITH APPROXIMATEklauzuli ORDER BY ma określone wymagania:
- Element ORDER BY musi być obecny: kwerendy bez klauzuli ORDER BY kończą się niepowodzeniem z powodu błędu .
- Dozwolona jest tylko kolumna odległości: klauzula ORDER BY musi odwoływać się tylko do kolumny odległości z zestawu wyników VECTOR_SEARCH. Dołączanie dodatkowych kolumn kończy się niepowodzeniem z powodu błędu. Aby posortować według wielu kolumn, użyj wzorca podzapytania opisanego w kolumnach Multiple ORDER BY (Wiele kolumn ORDER BY).
- Tylko kolejność rosnąca: kolumna odległości musi być uporządkowana w kolejności rosnącej (ASC). Kolejność malejąca (DESC) nie jest obsługiwana.
Prawidłowa WARTOŚĆ 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
Nieprawidłowe wzorce 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
Zachowanie bez indeksu wektorowego
VECTOR_SEARCH może wykonywać zapytania nawet wtedy, gdy w kolumnie docelowej nie istnieje żaden indeks wektorowy. Bez indeksu zapytanie wykonuje pełne skanowanie tabeli (k-najbliższego sąsiada (kNN) w celu obliczenia odległości dla wszystkich wierszy.
Zachowanie zapytania bez TOP Z PRZYBLIŻONĄ WARTOŚCIĄ
W przypadku użycia VECTOR_SEARCH bez SELECT TOP (N) WITH APPROXIMATEparametru zachowanie zapytania zależy od obecności TOP klauzul i ORDER BY :
- Brak top, brak ORDER BY lub ORDER BY non-distance: Pełne skanowanie tabeli (wyszukiwanie siłowe), które oblicza i zwraca odległości dla wszystkich wierszy
- TOP (bez PRZYBLIŻONA) z odległości ORDER BY: Wykonuje jako kNN (k najbliższych sąsiadów) wyszukiwanie, które jest dokładnie najbliższego sąsiada wyszukiwania
Przykład — pełne skanowanie z kolumną odległości:
-- 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
Przykład — wyszukiwanie kNN (dokładne najbliższe sąsiady):
-- 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 Z PRZYBLIŻONE BEZ VECTOR_SEARCH
Użycie SELECT TOP (N) WITH APPROXIMATE funkcji bez VECTOR_SEARCH funkcji w zapytaniu powoduje wystąpienie błędu. Klauzula WITH APPROXIMATE wymaga VECTOR_SEARCH obecności funkcji.
Odpowiedź nieprawidłowa — to zapytanie kończy się niepowodzeniem:
-- 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);
Odpowiedź prawidłowa — użyj 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;
OGRANICZENIA TRUNCATE TABLE
Tabele z indeksami wektorowymi nie mogą być obcinane przy użyciu polecenia TRUNCATE TABLE. Aby usunąć wszystkie dane z tabeli indeksowanej wektorowo:
- Usuwanie indeksu wektora
- Obcinanie tabeli
- Ponowne wypełnianie tabeli z co najmniej 100 wierszami
- Ponowne tworzenie indeksu wektora
Przykładowy przepływ pracy:
-- 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');
Wskazówki dotyczące tabel wyszukiwania wektorów
Możesz użyć wskazówek tabeli z funkcją VECTOR_SEARCH , aby kontrolować zachowanie wykonywania zapytań. Wskazówka FORCE_ANN_ONLY tabeli wymusza optymalizator zapytań, aby używał tylko przybliżonego indeksu najbliższego sąsiada (ANN), nawet jeśli optymalizator może w inny sposób wybrać inną strategię wykonywania.
Składnia:
FROM VECTOR_SEARCH(
TABLE = table_name,
COLUMN = column_name,
SIMILAR_TO = vector_value,
METRIC = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)
Example:
Poniższy przykład wymusza użycie przybliżonego indeksu najbliższego sąsiada dla zapytania wyszukiwania wektorowego:
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;
Użyj FORCE_ANN_ONLY polecenia , aby upewnić się, że zapytanie używa przybliżonej strategii indeksu najbliższego sąsiada, przesłaniając automatyczny wybór strategii optymalizatora.
Uwaga / Notatka
Użycie FORCE_ANN_ONLY wymaga obu następujących elementów:
- Indeks wektorowy w kolumnie docelowej
-
SELECT TOP (N) WITH APPROXIMATEw zapytaniu
Jeśli brakuje któregokolwiek z wymagań, zapytanie zakończy się niepowodzeniem, ponieważ nie może użyć przybliżonej strategii najbliższego sąsiada, którą wymusza wskazówka.
Łączenie wyszukiwania wektorów z innymi operacjami SQL
Funkcja VECTOR_SEARCH z TOP (N) WITH APPROXIMATE określonymi wymaganiami dotyczącymi jej użycia. Niektóre operacje SQL mogą być używane bezpośrednio z wyszukiwaniem wektorowym, podczas gdy inne wymagają wzorca podzapytania.
Operacje wymagające wzorca podzapytania
Jeśli musisz wykonać operacje, które nie są bezpośrednio zgodne z usługą TOP (N) WITH APPROXIMATE, użyj wyszukiwania wektorów w podzapytaniu (zapytanie wewnętrzne), a następnie zastosuj operacje w zapytaniu zewnętrznym. Ten wzorzec utrzymuje zalety wydajności przybliżonego wyszukiwania wektorów przy jednoczesnym włączeniu pełnej funkcjonalności JĘZYKA SQL.
Wskazówka
Wzorzec podzapytania działa dla każdej operacji, która nie może być połączona bezpośrednio z elementem TOP (N) WITH APPROXIMATE. Zastosuj wyszukiwanie wektorów w zapytaniu wewnętrznym, a następnie użyj dowolnej operacji SQL w zapytaniu zewnętrznym.
Typowe scenariusze
W poniższej tabeli wymieniono operacje wymagające wzorca podzapytania:
| Operation | Przykładowy przypadek użycia |
|---|---|
| GRUPUJ WEDŁUG | Obliczanie statystyk na kategorię |
| Funkcje agregujące | Ogólna LICZBA, ŚREDNIA, MINIMALNA, MAKSYMALNA LICZBA wyników |
| Funkcje okna | ROW_NUMBER, RANK, DENSE_RANK, NTILE |
| Ustawianie operacji | UNION, UNION ALL, Z WYJĄTKIEM, PRZECIĘCIE |
| Wiele kolumn ORDER BY | Sortuj według odległości, a następnie według daty lub tytułu |
| ODMIENNY | Usuwanie zduplikowanych wyników |
| STOSOWANIE KRZYŻOWE | Stosowanie wyszukiwania wektorów na wiersz z tabeli zewnętrznej |
GROUP BY i funkcje agregujące
Poniższy przykład znajduje średnią odległość od najlepiej pasujących artykułów według kategorii. W tym przykładzie kolumna category została dodana do tabeli w celu klasyfikowania wikipedia_articles artykułów.
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;
Funkcje okna
Poniższy przykład klasyfikuje artykuły według podobieństwa i przypisuje kwartyli.
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;
Operacje ustawiania (UNION, INTERSECT, Z WYJĄTKIEM)
Poniższy przykład łączy wyniki z dwóch różnych zapytań wyszukiwania przy użyciu funkcji 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;
ODMIENNY
Poniższy przykład pobiera różne kategorie od najważniejszych pasujących artykułów.
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;
Wiele kolumn ORDER BY
Poniższy przykład sortuje według odległości, a następnie według tytułu więzi.
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;
STOSOWANIE KRZYŻOWE
W przypadku używania z programem SELECT TOP (N) WITH APPROXIMATEVECTOR_SEARCHnie można używać CROSS APPLY ani OUTER APPLY w tej samej FROM klauzuli. Dotyczy to nawet wtedy, gdy w funkcji nie ma odwołania zewnętrznego VECTOR_SEARCH .
Zapytanie z CROSS APPLY poleceniem wykonuje logicznie wiele wyszukiwań wektorów (jeden na wiersz z tabeli zewnętrznej) i scala wszystkie wyniki w jednym uporządkowanym strumieniu. Przybliżony algorytm najbliższego sąsiada nie może efektywnie scalić wyników z wielu niezależnych wyszukiwań wektorów przy zachowaniu przybliżonych gwarancji i właściwości wydajności.
Wzorzec, który generuje błąd:
-- 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;
Ten wzorzec próbuje znaleźć podobne produkty dla preferencji klienta każdego zamówienia, ale nie można wykonać z przybliżonym wektorowym planem wyszukiwania.
Zalecany wzorzec:
Aby uzyskać podobne wyniki, użyj podzapytania TOP (N) WITH APPROXIMATE w CROSS APPLY samym:
-- 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';
W tym wzorcu:
- Każde wyszukiwanie wektorów jest ograniczone do 10 pierwszych wyników w podzapytaniu
- Zapytanie zewnętrzne nie używa
WITH APPROXIMATE - Wyniki są prawidłowo ograniczone do poszczególnych wierszy z tabeli zewnętrznej
Operacje, które działają bezpośrednio
Następujące operacje mogą być używane bezpośrednio bez VECTOR_SEARCH wymagania podzapytania:
- SPRZĘŻENIE WEWNĘTRZNE — zobacz Przykład D: sprzężenia wieloskładniki z SPRZĘŻENIA WEWNĘTRZNEGO
- GDZIE predykaty — stosowanie iteracyjnego lub po filtrowaniu
- Pojedyncza odległość ORDER BY