Udostępnij za pośrednictwem


CREATE VECTOR INDEX (Transact-SQL) (Podgląd)

Dotyczy do: SQL Server 2025 (17.x) Azure SQL DatabaseSQL 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ć:

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

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_INDEX Uż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_N parametr w programie, VECTOR_SEARCH aby 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:

  1. 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).
  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

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 .