CREATE VECTOR INDEX (Transact-SQL)

Dotyczy: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceBaza 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_SEARCH są 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_SEARCH są 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ć:

  • 1

    Zatrzymuje 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.

    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, oraz MERGE zachowując funkcjonalność indeksu wektorowego dzięki automatycznej, rzeczywistej konserwacji indeksów.
  • Filtrowanie iteracyjne: Stosuje predykaty zawarte w klauzuli WHERE podczas 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_INDEX Uż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_N parametr in VECTOR_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 niewektorowymiNULL .

    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 niewektorowymiNULL . 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ąc CREATE 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 niewektorowymiNULL .
  • 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:

  1. Włącz funkcję podglądu (wymaganą tylko dla SQL Server 2025; nie jest potrzebna dla Azure SQL Database ani bazy danych SQL w Fabric).
  2. Utwórz przykładową tabelę dbo.Articles z kolumną embedding z wektorem typu danych (5).
  3. Wstaw 100 wierszy przykładowych danych z pozorowanym osadzaniem danych.
  4. Utwórz indeks wektora w pliku dbo.Articles.embedding.
  5. Demonstruj wyszukiwanie podobieństwa wektorów za pomocą VECTOR_SEARCH funkcji .
-- 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.