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
Utwórz przybliżony indeks w kolumnie wektorowej, aby zwiększyć wydajność wyszukiwania 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 kontynuowaniem sprawdź ograniczenia i zagadnienia .
Uwaga / Notatka
Jako funkcja w wersji zapoznawczej technologia przedstawiona w tym artykule podlega dodatkowym warunkom użytkowania dla wersji zapoznawczych platformy Microsoft Azure.
Ostrzeżenie
Powiadomienie o wycofaniu: indeksy wektorów utworzone przy użyciu wcześniejszej struktury danych są obsługiwane w bieżącej wersji, ale zostaną wycofane w przyszłej wersji. Aby zapewnić zgodność i dostęp do najnowszych możliwości wyszukiwania wektorów, zmigruj istniejące indeksy wektorów, wykonując kroki opisane w sekcji Migrowanie z wcześniejszych wersji indeksu wektorowego .
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.
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.
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.
>1
Ogranicza 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.
Uwaga / Notatka
Operacje indeksowania równoległego nie są dostępne w każdej wersji programu SQL Server. Listę funkcji wspieranych przez edycje SQL Server można znaleźć w Editions and supported features of SQL Server 2022 and Editions oraz supported functions of SQL Server 2025.
Uaktualnianie indeksów wektorów do najnowszej wersji
Ważna
Powiadomienie o wycofaniu: indeksy wektorów utworzone przy użyciu wcześniejszej struktury danych są obsługiwane w bieżącej wersji, ale zostaną wycofane w przyszłej wersji. Aby zapewnić zgodność i dostęp do najnowszych możliwości wyszukiwania wektorów, zmigruj istniejące indeksy wektorów, wykonując poniższe 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. 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
Aby uzyskać szczegółowe informacje na temat wcześniejszych ograniczeń wersji indeksu wektorowego, zobacz sekcję Ograniczenia i zagadnienia.
Migrowanie z wcześniejszych wersji indeksu wektorowego
Indeksy wektorowe utworzone przy użyciu starszej wersji muszą zostać usunięte i utworzone ponownie, aby umożliwić korzystanie z najnowszych funkcji. 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
- Obsługuje już filtrowanie iteracyjne, pełną obsługę DML, wykonywanie optymalizatora i ulepszoną kwantyzację
- Brak wymaganej migracji
Utworzono przy użyciu starszej wersji
- Używa starszego zachowania po filtrze
- Nie obsługuje najnowszych funkcji wyszukiwania wektorów
- Migracja jest zdecydowanie zalecana, aby zapewnić zgodność w przyszłości
Krok 2. Usuwanie i ponowne tworzenie indeksu wektora
Nie można uaktualnić indeksów wektorów utworzonych przy użyciu 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 przy użyciu bieżącej CREATE VECTOR INDEX instrukcji automatycznie używają najnowszego formatu DiskANN. Nie są wymagane żadne dodatkowe opcje ani flagi.
Krok 3. Weryfikowanie wersji indeksu
Po odtworzeniu sprawdź, czy indeks korzysta z 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 dodatkowe ograniczenia. Aby sprawdzić wersję indeksu, zobacz Weryfikowanie wersji indeksu.
Tylko filtrowanie końcowe: Predykaty są stosowane tylko po pobieraniu wektorów, a nie podczas procesu wyszukiwania. Może to spowodować zwrócenie mniejszej liczby wierszy niż oczekiwano podczas stosowania filtrów.
Tabele tylko do odczytu: tabele z indeksami wektorowymi są tylko do odczytu. Po utworzeniu indeksu wektorowego nie są dozwolone żadne operacje DML (INSERT, UPDATE, DELETE, MERGE).
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 dostrajanie TOP_N: należy ręcznie dostosować
TOP_Nparametr w programie,VECTOR_SEARCHaby zrekompensować filtrowanie po filtrowaniu, często wymagając nadmiernych wartości w celu uzyskania żądanej liczby wyników.
Bieżące ograniczenia (dotyczy też najnowszej wersji)
Bieżąca wersja zapoznawcza ma następujące ograniczenia:
Indeksy wektorowe nie mogą być partycjonowane. Brak obsługi partycji.
Tabela musi mieć indeks klastrowany klucza podstawowego.
Indeksy wektorowe nie są replikowane do subskrybentów.
Tabele z indeksami wektorowymi nie mogą być obcinane przy użyciu polecenia
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. Aby uzyskać więcej informacji, zobacz OGRANICZENIA TRUNCATE TABLE.Nie można wdrożyć indeksów wektorowych za pomocą pakietu DacPac lub BACPAC. Indeksy wektorów wymagają co najmniej 100 wierszy z wektorami innych niż NULL w czasie tworzenia. Podczas importowania bazy danych przy użyciu pakietu DacPac, BACPAC lub usługi Import/Export proces importowania tworzy obiekty schematu (w tym indeksy wektorowe) przed załadowaniem danych, co powoduje niepowodzenie importowania.
Obejście: Upuść indeksy wektorów przed wyeksportowaniem bazy danych i utwórz ponownie indeksy po zaimportowaniu.
Minimalne wymagania dotyczące danych
Indeksy wektorów wymagają minimalnej liczby wierszy z wartościami wektorów innych niż NULL przed utworzeniem indeksu.
- Minimalna liczba wierszy: w tabeli musi istnieć co najmniej 100 wierszy z wartościami wektorów innych niż NULL.
- Zachowanie błędu: Próba utworzenia indeksu wektora w tabeli z mniej niż 100 wierszami kończy się niepowodzeniem z błędem 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 przypadku scenariuszy tworzenia i testowania, w których jest potrzebnych mniej wierszy, VECTOR_SEARCH działa bez indeksu przy użyciu podejścia do skanowania siłowego, chociaż wydajność spada w przypadku większych zestawów danych.
Obsługa języka DML
Po utworzeniu indeksu wektora DiskANN przy użyciu najnowszej wersji tabela nie jest już tylko do odczytu. Możesz swobodnie modyfikować dane przy użyciu standardowych operacji języka manipulowania danymi (DML), a zmiany są automatycznie odzwierciedlane 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
Obsługa języka DML jest dostępna tylko w przypadku indeksów wektorów utworzonych przy użyciu 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ą. Zestawy danych o dużej części zduplikowanych wektorów nie są zalecane do indeksowania wektorów.
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 jeśli większość lub wszystkie osadzanie są zastępowane — na przykład ponowne osadzanie zestawu danych przy użyciu nowego modelu — istniejący indeks może już nie odzwierciedlać nowej dystrybucji danych.
W scenariuszach zamiany na dużą skalę:
- Zapytania wyszukiwania wektorowego nadal zwracają prawidłowe wyniki
- Jednak jakość odwołań i klasyfikacji może ulec pogorszeniu, ponieważ struktura indeksu została utworzona dla innej dystrybucji osadzania.
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
Użytkownik musi mieć ALTER uprawnienia do tabeli.
Przykłady
Pobierz i zaimportuj artykuł Wikipedii z przykładowym osadzaniem wektorów .
Przykłady zakładają istnienie tabeli o nazwie wikipedia_articles z kolumną title_vector typu vector , która przechowuje osadzanie tytułów artykułów w Wikipedii.
title_vector przyjmuje się, że osadzanie jest generowane przy użyciu modelu osadzania, takiego jak osadzanie tekstu-ada-002 lub osadzanie tekstu-3-małe, co zwraca wektory z wymiarami 1536.
Aby uzyskać więcej przykładów, w tym kompleksowe rozwiązania, przejdź do repozytorium GitHub przykładów wyszukiwania wektorów usługi Azure SQL Database.
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 w title_vector kolumnie przy użyciu metryki produktu (ujemnej), dot ograniczając równoległość do wartości 8 i przechowując wektor w SECONDARY grupie 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
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 przedstawia CREATE VECTOR INDEX pozorne osadzanie:
- 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
) AS s
ORDER BY s.distance, t.title;
Przykład 4. Praca z operacjami DML
W poniższych przykładach pokazano operacje DML w 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 usuwania usunięty wiersz nie jest już wyświetlany w zapytaniach wyszukiwania 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 kolumna wektorowa zostanie zaktualizowana, indeks zostanie odpowiednio zaktualizowany, więc przyszłe wyszukiwania wektorów używają nowego osadzania.
Używanie funkcji MERGE w przypadku złożonych operacji
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 jest automatycznie aktualizowany w celu odzwierciedlenia wszystkich zmian wprowadzonych przez instrukcję MERGE .