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: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w Microsoft Fabric
Stwórz przybliżony indeks w kolumnie wektorowej, aby poprawić wydajność wyszukiwań najbliższych sąsiadów. Aby dowiedzieć się więcej o tym, jak działa indeksowanie wektorowe i wyszukiwanie wektorowe oraz jakie są różnice między wyszukiwaniem dokładnym a przybliżonym, zobacz wyszukiwanie wektorowe i indeksy wektorowe w SQL Database Engine.
Dostępność funkcji
- Indeks wektorowy i
VECTOR_SEARCHsą powszechnie dostępne (GA) w Azure SQL Database, baza danych SQL w Microsoft Fabric i Azure SQL Managed Instance z polityką aktualizacjiAlways-up-to-date. - Vector index oraz
VECTOR_SEARCHsą funkcjami podglądowymi w SQL Server 2025 (17.x) oraz w Azure SQL Managed Instance z polityką aktualizacji SQL Server 2025.
Ostrzeżenie
Powiadomienie o wycofaniu: Indeksy wektorowe utworzone przy użyciu wcześniejszej struktury danych są wspierane w obecnej wersji, ale zostaną wycofane w przyszłej wersji. Aby zapewnić przyszłą kompatybilność i dostęp do najnowszych możliwości wyszukiwania wektorowego, migruj istniejące indeksy wektorowe, korzystając z kroków w sekcji Migracja z wcześniejszych wersji indeksu wektorowego .
Funkcja podglądowa SQL Server 2025
W SQL Server 2025 oraz Azure SQL Managed Instance w zasadzie aktualizacjiSQL Server 2025 indeksy wektorowe oraz funkcja VECTOR_SEARCH są w podglądzie i mogą ulec zmianie. Aby korzystać z tej funkcji, musisz włączyć konfigurację PREVIEW_FEATURESskalowaną bazą danych.
Sprawdź aktualne ograniczenia przed użyciem.
Uwaga / Notatka
Najnowsza wersja indeksów wektorowych jest dostępna w Azure SQL Database, baza danych SQL w Microsoft Fabric oraz Azure SQL Managed Instance z polityką aktualizacji Always-up-to-date.
Składnia
Transact-SQL konwencje składni
CREATE VECTOR INDEX index_name
ON object ( vector_column )
[ WITH (
[ , ] METRIC = { 'cosine' | 'dot' | 'euclidean' }
[ [ , ] TYPE = 'DiskANN' ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
) ]
[ ON { filegroup_name | "default" } ]
[;]
Argumenty (w programowaniu)
index_name
Nazwa indeksu. Nazwy indeksów muszą być unikatowe w tabeli, ale nie muszą być unikatowe w bazie danych. Nazwy indeksów muszą być zgodne z regułami identyfikatorów.
sprzeciwiać się
Tabela, na której jest tworzony indeks. Musi to być tabela podstawowa. Widoki, tabele tymczasowe, zarówno lokalne, jak i globalne, nie są obsługiwane.
vector_column
Kolumna do użycia w celu utworzenia indeksu wektora. Musi być typu wektorowego .
METRYKA
Ciąg o nazwie metryki odległości używanej do obliczania odległości między dwoma podanymi wektorami. Obsługiwane są następujące metryki odległości:
-
cosine- Odległość cosinusu -
euclidean- Odległość euklidesowa -
dot- (Ujemna) Kropka produktu
TYPE
Typ algorytmu ANN używanego do tworzenia indeksu. Obecnie obsługiwane są tylko DiskANN. DiskANN jest wartością domyślną.
MAXDOP
Zastępuje maksymalny stopień równoległości opcji konfiguracji dla operacji indeksowania. Aby uzyskać więcej informacji, zobacz Konfiguracja serwera: maksymalny stopień równoległości. Użyj MAXDOP, aby ograniczyć stopień równoległości i wynikowe użycie zasobów dla operacji kompilacji indeksu.
max_degree_of_parallelism może to być:
1Zatrzymuje generowanie planu równoległego.
>
1Ogranicza maksymalny stopień równoległości używany w operacji indeksowania równoległego do określonej liczby lub mniejszej na podstawie bieżącego obciążenia systemu.
0(ustawienie domyślne)Używa stopnia równoległości określonego na poziomie serwera, bazy danych lub grupy obciążenia, chyba że zostanie zmniejszona na podstawie bieżącego obciążenia systemu.
Aby uzyskać więcej informacji, zobacz Konfigurowanie operacji indeksowania równoległego.
Operacje indeksowania równoległego nie są dostępne w każdej wersji programu SQL Server. Listę funkcji wspieranych przez edycje w SQL Server można znaleźć w artykule Edycje i wspierane funkcje SQL Server 2025.
Uaktualnianie indeksów wektorów do najnowszej wersji
Ważna
Powiadomienie o wycofaniu: Obecna wersja obsługuje indeksy wektorowe utworzone przy użyciu wcześniejszej struktury danych, ale przyszła wersja zrezygnuje z tego wsparcia. Aby zapewnić przyszłą kompatybilność i dostęp do najnowszych możliwości wyszukiwania wektorowego, migruj istniejące indeksy wektorowe, stosując następujące kroki.
Nowo utworzone indeksy wektorów automatycznie używają najnowszej struktury danych, która zapewnia:
-
Pełna obsługa języka DML: usuwa poprzednie ograniczenie, które sprawiło, że tabele indeksowane wektorowo tylko do odczytu po utworzeniu indeksu. Możesz teraz wykonywać
INSERToperacje ,UPDATE,DELETE, orazMERGEzachowując funkcjonalność indeksu wektorowego dzięki automatycznej, rzeczywistej konserwacji indeksów. -
Filtrowanie iteracyjne: Stosuje predykaty zawarte w klauzuli
WHEREpodczas procesu wyszukiwania wektorowego, a nie po jej odzyskaniu. - Optymalizacja oparta na optymalizatorze: Optymalizator zapytań automatycznie decyduje, czy użyć indeksu DiskANN czy wyszukiwania kNN na podstawie cech zapytania.
- Zaawansowana kwantyzacja: Integruje techniki kwantyzacji wektorowej, aby zapewnić lepszą efektywność przechowywania i szybsze wykonywanie zapytań. Te optymalizacje są przejrzyste dla użytkowników.
Szczegóły dotyczące wcześniejszych ograniczeń wersji indeksu wektorowego można znaleźć w sekcji Ograniczenia i rozważania.
Migrowanie z wcześniejszych wersji indeksu wektorowego
Aby umożliwić najnowsze funkcje, musisz usunąć i odtworzyć indeksy wektorowe wykorzystujące wcześniejszą wersję. W tej sekcji wyjaśniono, jak identyfikować, migrować i weryfikować wersje indeksów wektorowych.
Krok 1. Identyfikowanie istniejących indeksów wektorów
Użyj następującego zapytania, aby zidentyfikować indeksy wektorów, które wymagają migracji:
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version,
CASE
WHEN JSON_VALUE(v.build_parameters, '$.Version') >= '3'
THEN 'Uses latest version (no migration required)'
WHEN JSON_VALUE(v.build_parameters, '$.Version') < '3'
THEN 'Created using an earlier version (migration recommended)'
ELSE 'Unknown format'
END AS migration_status
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
ORDER BY t.name, i.name;
Jak interpretować wyniki
Używa najnowszej wersji
- Już wspiera filtrowanie iteracyjne, pełne wsparcie DML, wykonanie oparte na optymalizatorze oraz ulepszoną kwantyzację.
- Migracja nie jest wymagana.
Utworzono przy użyciu starszej wersji
- Wykorzystuje zachowanie po przefiltrowaniu starszym.
- Nie obsługuje najnowszych funkcji wyszukiwania wektorowego.
- Zaleca się migrację, aby zapewnić przyszłą kompatybilność.
Krok 2. Usuwanie i ponowne tworzenie indeksu wektora
Nie można ulepszyć indeksów wektorowych, które używają wcześniejszego formatu. Aby włączyć najnowsze możliwości diskANN, upuść i ponownie utwórz indeks.
Ostrzeżenie
Wpływ usługi: natychmiastowe usunięcie indeksu wektora wyłącza przybliżone wyszukiwanie wektorów w tabeli, której dotyczy problem, dopóki indeks nie zostanie utworzony ponownie. Planowanie migracji podczas okien obsługi dla systemów produkcyjnych.
Usuwanie istniejącego indeksu
DROP INDEX vec_idx ON dbo.wikipedia_articles;
Ponowne tworzenie indeksu
CREATE VECTOR INDEX vec_idx
ON dbo.wikipedia_articles (title_vector)
WITH (
TYPE = 'DISKANN',
METRIC = 'COSINE'
);
Uwaga / Notatka
Indeksy wektorowe utworzone za pomocą CREATE VECTOR INDEX aktualnego wyciągu automatycznie używają najnowszego formatu DiskANN. Nie są wymagane żadne dodatkowe opcje ani flagi.
Krok 3. Weryfikowanie wersji indeksu
Po odtworzeniu indeksu sprawdź, czy używa najnowszej wersji:
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
WHERE i.name = 'vec_idx';
Kolumna powinna być wyświetlana index_version3 dla najnowszej wersji.
Zachowanie błędu z niezgodnością wersji
Jeśli spróbujesz użyć parametru TOP_N w pliku z VECTOR_SEARCH najnowszym indeksem wektora wersji, program SQL Server zwróci 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, usuń TOP_N parametr z VECTOR_SEARCH i zamiast tego użyj SELECT TOP (N) WITH APPROXIMATE składni. Aby uzyskać szczegółowe informacje, zobacz Błąd przy użyciu starszej składni.
Ograniczenia i zagadnienia
Wcześniejsze ograniczenia wersji indeksu wektorowego
Wcześniejsze wersje indeksu wektorowego mają następujące ograniczenia. Aby sprawdzić wersję indeksu, zobacz Weryfikowanie wersji indeksu.
Tylko po filtrowaniu: Predykaty obowiązują dopiero po odzyskaniu wektorów, a nie podczas procesu wyszukiwania. Takie zachowanie może skutkować mniejszą liczbą zwrotów wierszy niż oczekiwano po zastosowaniu filtrów.
Tabele tylko do odczytu: tabele z indeksami wektorowymi są tylko do odczytu. Nie możesz wykonać operacji DML (
INSERT,UPDATE, ,DELETE)MERGEpo utworzeniu indeksu wektorowego.ALLOW_STALE_VECTOR_INDEXUżyj konfiguracji o zakresie bazy danych, aby włączyć operacje DML, jeśli można tolerować nieaktualne wyniki wyszukiwania.Ręczne strojenie TOP_N: Musisz ręcznie dostosować
TOP_Nparametr inVECTOR_SEARCH, aby zrekompensować post-filtrowanie. Często potrzebne są wartości powiększone, aby uzyskać pożądaną liczbę wyników.
Bieżące ograniczenia (dotyczy też najnowszej wersji)
Bieżąca wersja zapoznawcza ma następujące ograniczenia:
Nie da się podzielić indeksów wektorowych.
Tabela musi mieć klucz główny klastrowany w kolumnie int .
Indeksy wektorowe nie są replikowane do subskrybentów.
Nie można obciąć tabel z indeksami wektorowymi, używając
TRUNCATE TABLE. Aby usunąć wszystkie dane, najpierw upuść indeks wektorowy, obcinaj tabelę, ponownie wypełniaj je co najmniej 100 wierszami, a następnie utwórz ponownie indeks. Więcej informacji można znaleźć w sekcjiTRUNCATE TABLE ograniczenia.Indeksów wektorowych nie da się wdrożyć z DacPac. Możesz wdrażać bazy danych zawierające indeksy wektorowe z BACPAC, zaczynając od DacFx w wersji 170.5.96. Indeksy wektorowe są tworzone po załadowaniu danych tabelowych, a indeksowana tabela musi zawierać co najmniej 100 wierszy z wartościami niewektorowymi
NULL.Podczas wdrożenia DACPAC opartego wyłącznie na schematach, wdrożenie może się powiodować bez tworzenia indeksu wektorowego, jeśli docelowa tabela zawiera mniej niż 100 wierszy z wartościami niewektorowymi
NULL. DacFx nie tworzy automatycznie pominiętego indeksu, gdy wiersze są dodawane później. Po załadowaniu co najmniej 100 kwalifikujących się wierszy utwórz indeks wektorowy za pomocą skryptu po wdrożeniu, ponownie publikując DACPAC lub uruchamiającCREATE VECTOR INDEX.Po imporcie lub wdrożeniu sprawdź, czy indeks wektorowy został utworzony przez zapytanie
sys.vector_indexes.Jako obejście przed wersją DacFx 170.5.96, można usunąć indeksy wektorowe przed eksportem bazy danych i odtworzyć indeksy po imporcie.
Minimalne wymagania dotyczące danych
Indeksy wektorowe wymagają minimalnej liczby wierszy o wartościach niewektorowychNULL , zanim można utworzyć indeks.
-
Minimalna liczba wierszy: Tabela musi zawierać co najmniej 100 wierszy z wartościami niewektorowymi
NULL. - Zachowanie błędu: Jeśli spróbujesz utworzyć indeks wektorowy w tabeli z mniej niż 100 wierszami, operacja kończy się niepowodzeniem i zwraca błąd Msg 42266.
przykładowy błąd :
Msg 42266, Level 16, State 1
Cannot create a vector index. The table contains only 8 rows with non-null vectors,
but at least 100 are required for vector index creation.
Najlepsze rozwiązanie: wypełnij tabelę co najmniej 100 wierszami przed utworzeniem indeksu wektorowego. W scenariuszach programowania i testowania, gdzie potrzebujesz mniej wierszy, działa VECTOR_SEARCH bez indeksu metodą brute-force scan. Jednak ta metoda pogarsza wydajność przy większych zbiorach danych.
Obsługa języka DML
Gdy tworzysz indeks wektorowy DiskANN używając najnowszej wersji, tabela przestaje być tylko do odczytu. Możesz modyfikować dane, używając standardowych operacji języka manipulacji danymi (DML), a zmiany automatycznie pojawiają się w wynikach wyszukiwania wektorowego.
Ta funkcja sprawia, że wyszukiwanie wektorów nadaje się do dynamicznych obciążeń transakcyjnych, w których dane zmieniają się w czasie.
Uwagi dotyczące zachowania
- Operacje DML nie wymagają upuszczania ani ponownego kompilowania indeksu wektora.
- Zmiany są widoczne dla wektorowych zapytań wyszukiwania po zatwierdzeniach transakcji.
- W przypadku zamiany danych na dużą skalę (na przykład usunięcie większości wierszy i wstawienie całkowicie nowego zestawu osadzonych) rozważ usunięcie i ponowne utworzenie indeksu wektora po załadowaniu danych w celu zapewnienia optymalnej jakości wyszukiwania.
Uwaga / Notatka
Wsparcie dla DML jest dostępne tylko z indeksami wektorowymi utworzonymi w najnowszej wersji. Wcześniejsze wersje wymagają, aby tabele używały konfiguracji tylko do odczytu lub korzystały ALLOW_STALE_VECTOR_INDEX z konfiguracji o określonym zakresie bazy danych.
Monitorowanie konserwacji indeksu wektora
Indeksy wektorów wykonują konserwację w tle, aby uwzględnić zmiany DML. Użyj dynamicznego widoku zarządzania sys.dm_db_vector_indexes, aby monitorować stan zadania kondycji indeksu i konserwacji.
Łączenie indeksów wektorów z tradycyjnymi indeksami
Indeksy wektorowe działają obok tradycyjnych indeksów drzewa B, aby zapewnić optymalną wydajność zapytań. W przypadku korzystania z filtrowania VECTOR_SEARCHiteracyjnego za pomocą funkcji należy rozważyć utworzenie tradycyjnych indeksów w kolumnach używanych w predykatach filtru.
Aby uzyskać szczegółowe informacje na temat zachowania iteracyjnego filtrowania i różnic w zależności od wcześniejszych wersji, zobacz Iteracyjne zachowanie filtrowania.
Wskazówka
Optymalizator zapytań automatycznie wybiera najlepszą strategię wykonywania (przybliżony indeks najbliższego sąsiada a wyszukiwanie kNN). Aby wymusić użycie przybliżonego indeksu najbliższego sąsiada FORCE_ANN_ONLY , użyj wskazówki tabeli. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące tabel wyszukiwania wektorów.
Przykładowy scenariusz:
-- Create vector index for similarity search
CREATE VECTOR INDEX idx_embeddings_vector
ON product_embeddings(embedding)
WITH (METRIC = 'cosine');
-- Create traditional index for filter columns
CREATE NONCLUSTERED INDEX idx_embeddings_filters
ON product_embeddings(category);
Korzyść z wydajności:
Podczas wykonywania zapytań z filtrowaniem iteracyjnym optymalizator zapytań programu SQL Server używa obu typów indeksów:
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'wireless headphones' USE MODEL EmbeddingModel);
SELECT TOP (10) WITH APPROXIMATE
p.name,
p.price,
vs.distance
FROM products p
INNER JOIN VECTOR_SEARCH(
TABLE = product_embeddings AS e,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS vs ON p.id = e.product_id
WHERE e.approved = 1
AND e.category = 'Electronics' -- Can use traditional index
ORDER BY vs.distance;
W tym zapytaniu:
- Indeks wektorowy identyfikuje podobne osadzanie na podstawie wektora zapytania
-
Tradycyjny indeks filtrów
(category)kandydatów wydajnie podczas iteracyjnego procesu wyszukiwania
Ta strategia złożona może znacznie poprawić wydajność zapytań w porównaniu z użyciem tylko indeksu wektorowego, szczególnie gdy predykaty filtrów mają wysoką selektorowość.
Wskazówki dotyczące jakości i konserwacji danych dla indeksów wektorów
Unikaj zestawów danych z dużymi zduplikowanymi osadzaniami
Indeksowanie wektorowe działa najlepiej, gdy osadzanie reprezentuje zróżnicowaną zawartość semantyczną. Nie używaj zbiorów danych z dużą ilością duplikatów do indeksowania wektorowego.
Duże duplikowanie może prowadzić do:
- Niska jakość wyników: zduplikowane wektory pojawiają się wielokrotnie w wynikach, tłumując bardziej istotne dopasowania semantyczne.
- Zmniejszona skuteczność: Zduplikowane osadzanie przesiedlają lepszych sąsiadów, obniżając użyteczność wyszukiwania podobieństwa.
- Niepotrzebne użycie zasobów: indeksy wektorowe są kosztowne do kompilowania i konserwacji, a duplikaty dodają koszt bez dodawania wartości.
Najlepsze rozwiązanie: deduplikuj osadzanie przed utworzeniem indeksu wektora w celu zwiększenia wydajności i jakości wyników.
Scenariusze zamiany danych na dużą skalę
Indeksy wektorowe obsługują wstawianie, aktualizacje i usuwanie. Jednak gdy zastąpisz większość lub wszystkie osadzenia — na przykład ponowne osadzenie zbioru danych nowym modelem — istniejący indeks może przestać odzwierciedlać nowy rozkład danych.
W scenariuszach zamiany na dużą skalę:
- Zapytania wyszukiwania wektorowego nadal zwracają poprawne wyniki.
- Jakość przypominania i rankingu może się pogorszyć, ponieważ struktura indeksu została stworzona dla innego rozkładu osadzenia.
Najlepsze rozwiązanie: Podczas przeprowadzania niemal kompletnego zastępowania danych (usuwanie i wstawianie nowych osadzania) upuść i utwórz ponownie indeks wektora po załadowaniu nowych danych. Ponowne utworzenie indeksu gwarantuje, że jest zoptymalizowany pod kątem nowej dystrybucji osadzania i przywraca przewidywalne zachowanie zapytań.
Znane problemy
Aby uzyskać więcej informacji, zobacz Znane problemy.
Uprawnienia
Potrzebujesz ALTER zgody na stole.
Przykłady
Pobierz i zaimportuj artykuł Wikipedii z przykładowym osadzaniem wektorów .
Te przykłady zakładają tabelę wikipedia_articles nazwaną kolumną title_vector typu vector przechowującą osadzenia tytułów artykułów Wikipedii. Wykorzystuje title_vector model osadzania taki, jak text-embedding-ada-002 lub text-embedding-3-small, który zwraca wektory o 1 536 wymiarach.
Więcej przykładów, w tym rozwiązań end-to-end, można znaleźć w repozytorium Azure SQL Database Vector Search Samples GitHub.
Przykład 1
Poniższy przykład tworzy indeks wektorowy w kolumnie title_vector przy użyciu cosine metryki.
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'COSINE', TYPE = 'DISKANN');
Przykład 2
Poniższy przykład tworzy indeks wektorowy na kolumnie title_vector przy użyciu metryki iloczynu (ujemnego). dot Ogranicza równoległość do 8 i przechowuje wektor w grupie SECONDARY plików.
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
ON [SECONDARY];
Przykład 3
Ten przykład używa CREATE VECTOR INDEX funkcji powiązanej VECTOR_SEARCH z nią i . Osadzanie są wyśmiewane. W rzeczywistym scenariuszu generuj osadzenia za pomocą modelu osadzania i AI_GENERATE_EMBEDDINGS, lub użyj zewnętrznej biblioteki, takiej jak OpenAI SDK.
Uwaga / Notatka
Najnowsza wersja indeksów wektorowych wymaga co najmniej 100 wierszy danych, zanim można je utworzyć. 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 przedstawia CREATE VECTOR INDEX pozorne osadzanie:
- Włącz funkcję podglądu (wymaganą tylko dla SQL Server 2025; nie jest potrzebna dla Azure SQL Database ani bazy danych SQL w 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
) AS s
ORDER BY s.distance, t.title;
Przykład 4. Praca z operacjami DML
Poniższe przykłady pokazują operacje DML na tabeli z indeksem wektorowym utworzonym przy użyciu najnowszej wersji.
Usuwanie wierszy
Usunięcie wierszy powoduje usunięcie ich zarówno z tabeli, jak i wyników wyszukiwania wektorów.
DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;
Po zakończeniu operacji usuwania usunięty wiersz nie pojawia się już w zapytaniach wektorowego.
Wstaw nowe wiersze
Można wstawić nowe wiersze z osadzanymi elementami i natychmiast można je przeszukiwać bez ponownego kompilowania indeksu.
INSERT INTO dbo.wikipedia_articles (id, title, title_vector)
VALUES (
99999,
N'Quantum Computing Basics',
AI_GENERATE_EMBEDDINGS(N'Quantum Computing Basics' USE MODEL Ada2Embeddings)
);
Nowo wstawione osadzanie są automatycznie dołączane do indeksu wektorowego i mogą być zwracane przez kolejne zapytania wyszukiwania wektorów.
Aktualizowanie istniejących wierszy
Aktualizowanie wektorów lub kolumn niewektorowych jest w pełni obsługiwane.
DECLARE @new_embedding VECTOR(1536);
SET @new_embedding = AI_GENERATE_EMBEDDINGS(N'Updated article title' USE MODEL Ada2Embeddings);
UPDATE dbo.wikipedia_articles
SET title_vector = @new_embedding,
title = N'Updated article title'
WHERE id = 50000;
Jeśli zaktualizujesz kolumnę wektorową, indeks będzie się odpowiednio aktualizował, więc przyszłe wyszukiwania wektorowe będą używać nowego osadzenia.
Zastosowanie MERGE do operacji złożonych
Instrukcja MERGE umożliwia wykonywanie operacji wstawiania, aktualizowania i usuwania w jednej instrukcji.
MERGE INTO dbo.wikipedia_articles AS target
USING (
SELECT
id,
title,
AI_GENERATE_EMBEDDINGS(title USE MODEL Ada2Embeddings) AS title_vector
FROM dbo.staging_articles
) AS source
ON target.id = source.id
WHEN MATCHED THEN
UPDATE SET
title = source.title,
title_vector = source.title_vector
WHEN NOT MATCHED BY TARGET THEN
INSERT (id, title, title_vector)
VALUES (source.id, source.title, source.title_vector)
WHEN NOT MATCHED BY SOURCE AND target.id > 100000 THEN
DELETE;
Indeks wektorowy automatycznie aktualizuje się, odzwierciedlając wszystkie zmiany wprowadzone przez to MERGE oświadczenie.