CREATE VECTOR INDEX (Transact-SQL)

Van toepassing op: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Maak een benaderende index op een vectorkolom om de prestaties van zoekopdrachten bij dichtstbijzijnde buren te verbeteren. Voor meer informatie over hoe vectorindexering en vectorzoekopdracht werken, en de verschillen tussen exacte en benaderende zoek, zie Vector search en vectorindexen in de SQL Database Engine.

Beschikbaarheid van functies

  • Vector index en VECTOR_SEARCH zijn algemeen beschikbaar (GA) in Azure SQL Database, SQL-database in Microsoft Fabric, en Azure SQL Managed Instance met het Always-up-to-datumupdatebeleid.
  • Vector index en VECTOR_SEARCH zijn previewfuncties in SQL Server 2025 (17.x) en in Azure SQL Managed Instance met het SQL Server 2025 updatebeleid.

Waarschuwing

Kennisgeving van veroudering: Vectorindexen die zijn aangemaakt met een eerdere datastructuur worden ondersteund in de huidige versie, maar worden in een toekomstige versie met pensioen gestuurd. Om toekomstige compatibiliteit en toegang tot de nieuwste vectorzoekmogelijkheden te waarborgen, migreer je bestaande vectorindexen door gebruik te maken van de stappen in de sectie Migreren vanaf eerdere vectorindexversies .

SQL Server 2025 previewfunctie

In SQL Server 2025 en Azure SQL Managed Instance, in het SQL Server 2025updatebeleid, zijn vectorindexen en de VECTOR_SEARCH functie in preview en onderhevig aan wijziging. Om deze functie te gebruiken, moet je de PREVIEW_FEATURESdatabase-scoped configuratie inschakelen.

Controleer de huidige beperkingen voordat je hem gebruikt.

Opmerking

De nieuwste versie van vectorindexen is beschikbaar in Azure SQL Database, SQL-database in Microsoft Fabric en Azure SQL Managed Instance met het Always-up-to-date-updatebeleid.

Syntaxis

Transact-SQL syntaxis-conventies

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" } ]
[;]

Argumenten

index_name

De naam van de index. Indexnamen moeten uniek zijn binnen een tabel, maar hoeven niet uniek te zijn binnen een database. Indexnamen moeten de regels van id's volgen.

object

Tabel waarop de index wordt gemaakt. Het moet een basistabel zijn. Weergaven, tijdelijke tabellen, zowel lokaal als globaal, worden niet ondersteund.

vector_column

Kolom die moet worden gebruikt om de vectorindex te maken. Het moet van vectortype zijn.

METRIEK

Een tekenreeks met de naam van de metrische afstand die moet worden gebruikt om de afstand tussen de twee opgegeven vectoren te berekenen. De volgende metrische gegevens over afstand worden ondersteund:

  • cosine - Cosinusafstand
  • euclidean - Euclidische afstand
  • dot - (Negatief) Dot-product

TYPE

Het type ANN-algoritme dat wordt gebruikt om de index te bouwen. Alleen DiskANN wordt momenteel ondersteund. DiskANN is de standaardwaarde.

MAXDOP

Overschrijft de maximale mate van parallelle uitvoering configuratieoptie voor de indexbewerking. Zie Serverconfiguratie: maximale mate van parallelle uitvoeringvoor meer informatie. Gebruik MAXDOP om de mate van parallelle uitvoering en het resulterende resourceverbruik voor een indexbuildbewerking te beperken.

max_degree_of_parallelism kan het volgende zijn:

  • 1

    Onderdrukt het genereren van parallelle plannen.

  • >1

    Hiermee beperkt u de maximale mate van parallelle uitvoering die wordt gebruikt in een parallelle indexbewerking tot het opgegeven getal of minder op basis van de huidige systeemworkload.

  • 0 (standaard)

    Maakt gebruik van de mate van parallelle uitvoering die is opgegeven op server-, database- of workloadgroepsniveau, tenzij verminderd op basis van de huidige systeemworkload.

    Zie Parallelle indexbewerkingen configurerenvoor meer informatie.

    Parallelle indexbewerkingen zijn niet beschikbaar in elke editie van SQL Server. Voor een lijst van functies die door de edities in SQL Server worden ondersteund, zie Edities en ondersteunde functies van SQL Server 2025.

Vectorindexen upgraden naar de nieuwste versie

Belangrijk

Kennisgeving van veroudering: De huidige release ondersteunt vectorindexen die zijn gemaakt met een eerdere datastructuur, maar een toekomstige versie zal die ondersteuning met pensioen trekken. Om toekomstige compatibiliteit en toegang tot de nieuwste vectorzoekmogelijkheden te waarborgen, migreer je bestaande vectorindexen met de volgende stappen.

Nieuw gemaakte vectorindexen maken automatisch gebruik van de meest recente gegevensstructuur, die het volgende biedt:

  • Volledige DML-ondersteuning: hiermee verwijdert u de vorige beperking die vector-geïndexeerde tabellen alleen-lezen heeft gemaakt na het maken van de index. Je kunt nu , UPDATE, DELETE, en operaties MERGE uitvoeren INSERTterwijl je de vectorindexfunctionaliteit behoudt met automatisch, realtime indexonderhoud.
  • Iteratieve filtering: Past predicaten toe in de WHERE clausule tijdens het vectorzoekproces, niet na het ophalen.
  • Optimizer-gestuurd: De query-optimizer bepaalt automatisch of de DiskANN-index of de kNN-zoekfunctie wordt gebruikt op basis van query-eigenschappen.
  • Geavanceerde kwantisatie: Integreert vectorkwantisatietechnieken om betere opslagefficiëntie en snellere queryprestaties te bieden. Deze optimalisaties zijn transparant voor gebruikers.

Voor details over eerdere beperkingen van vectorindexversies, zie de sectie Beperkingen en overwegingen.

Migreren van eerdere vectorindexversies

Om de nieuwste mogelijkheden in te schakelen, moet je vectorindexen verwijderen en opnieuw maken die een eerdere versie gebruiken. In deze sectie wordt uitgelegd hoe u vectorindexversies identificeert, migreert en verifieert.

Stap 1: Bestaande vectorindexen identificeren

Gebruik de volgende query om vectorindexen te identificeren waarvoor migratie is vereist:

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;
De resultaten interpreteren

Maakt gebruik van de nieuwste versie

  • Ondersteunt al iteratieve filtering, volledige DML-ondersteuning, optimalisatiegedreven uitvoering en verbeterde kwantisatie.
  • Er is geen migratie vereist.

Gemaakt met een eerdere versie

  • Gebruikt legacy post-filter gedrag.
  • Ondersteunt de nieuwste vectorzoekmogelijkheden niet.
  • Migratie wordt sterk aanbevolen om toekomstige compatibiliteit te waarborgen.

Stap 2: de vectorindex verwijderen en opnieuw maken

Je kunt geen vectorindexen upgraden die een eerder formaat gebruiken. Als u de nieuwste mogelijkheden van DiskANN wilt inschakelen, verwijdert u de index en maakt u deze opnieuw.

Waarschuwing

Gevolgen voor de service: als u een vectorindex verwijdert, wordt het zoeken naar vectoren in de betreffende tabel onmiddellijk uitgeschakeld totdat de index opnieuw wordt gemaakt. Plan migraties tijdens onderhoudsvensters voor productiesystemen.

De bestaande index verwijderen
DROP INDEX vec_idx ON dbo.wikipedia_articles;
De index opnieuw maken
CREATE VECTOR INDEX vec_idx
    ON dbo.wikipedia_articles (title_vector)
    WITH (
        TYPE = 'DISKANN',
        METRIC = 'COSINE'
    );

Opmerking

Vectorindexen die worden gemaakt met de huidige CREATE VECTOR INDEX instructie gebruiken automatisch het nieuwste DiskANN-formaat. Er zijn geen extra opties of vlaggen vereist.

Stap 3: De indexversie controleren

Controleer na het opnieuw aanmaken van de index of deze de nieuwste versie gebruikt:

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';

De index_version kolom moet worden weergegeven 3 voor de nieuwste versie.

Foutgedrag met versie-incompatibiliteit

Als u de parameter TOP_N probeert te gebruiken VECTOR_SEARCH met een meest recente versievectorindex, retourneert SQL Server de volgende fout:

Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.

Als u deze fout wilt oplossen, verwijdert u de TOP_N parameter uit VECTOR_SEARCH en gebruikt u in plaats daarvan de SELECT TOP (N) WITH APPROXIMATE syntaxis. Zie Fout met verouderde syntaxis voor gedetailleerde informatie.

Beperkingen en overwegingen

Beperkingen van eerdere vectorindexversies

Eerdere vectorindexversies hebben de volgende beperkingen. Zie De indexversie controleren om de indexversie te controleren.

  • Alleen na het filteren: Predicaten zijn pas van toepassing na vectoropvraging, niet tijdens het zoekproces. Dit gedrag kan resulteren in minder rijen die worden teruggegeven dan verwacht wanneer je filters toepast.

  • Alleen-lezen tabellen: tabellen met vectorindexen zijn alleen-lezen. Je kunt geen DML-bewerkingen (INSERT, UPDATE, , DELETE) MERGEuitvoeren nadat je de vectorindex hebt gemaakt. Gebruik de ALLOW_STALE_VECTOR_INDEX databaseconfiguratie om DML-bewerkingen in te schakelen als u verouderde zoekresultaten kunt tolereren.

  • Handmatig TOP_N afstemmen: Je moet de TOP_N parameter handmatig VECTOR_SEARCH aanpassen om te compenseren voor het na-filteren. Je hebt vaak oversized waarden nodig om het gewenste aantal resultaten te krijgen.

Huidige beperkingen (geldt ook voor de nieuwste versie)

De huidige preview heeft de volgende beperkingen:

  • Je kunt vectorindexen niet partitioneren.

  • De tabel moet een primaire sleutel geclusterde index op een int-kolom hebben.

  • Vectorindexen worden niet gerepliceerd naar abonnees.

  • Je kunt tabellen niet afsnijden met vectorindexen door gebruik te maken TRUNCATE TABLEvan . Als u alle gegevens wilt verwijderen, moet u eerst de vectorindex verwijderen, de tabel afkappen, opnieuw vullen met ten minste 100 rijen en vervolgens de index opnieuw maken. Voor meer informatie, zie TRUNCATE TABLE beperkingen.

  • Vectorindexen kunnen niet worden uitgerold met DacPac. Je kunt databases uitrollen die vectorindexen bevatten met BACPAC, beginnend met DacFx versie 170.5.96. Vectorindexen worden aangemaakt nadat de tabelgegevens zijn geladen, en de geïndexeerde tabel moet minstens 100 rijen met niet-vectorwaardenNULL bevatten.

    Tijdens een schema-only DACPAC-implementatie kan de implementatie slagen zonder de vectorindex te creëren als de doeltabel minder dan 100 rijen bevat met niet-vectorwaardenNULL . DacFx maakt de overgeslagen index niet automatisch aan wanneer rijen later worden toegevoegd. Na het laden van minstens 100 kwalificerende rijen maak je de vectorindex aan door een post-deployment script te gebruiken, de DACPAC opnieuw te publiceren, of te draaien CREATE VECTOR INDEX.

    Controleer na een import of implementatie dat de vectorindex is aangemaakt door te queryen sys.vector_indexes.

    Als een workaround vóór DacFx versie 170.5.96, plaats je vectorindexen voordat je de database exporteert, en maak je de indexen opnieuw aan na import.

Minimale gegevensvereisten

Vectorindexen vereisen een minimum aantal rijen met niet-vectorwaardenNULL voordat je de index kunt maken.

  • Minimum aantal rijen: De tabel moet minstens 100 rijen hebben met niet-vectorNULL waarden.
  • Foutgedrag: Als je probeert een vectorindex te maken op een tabel met minder dan 100 rijen, faalt de bewerking en geeft foutmelding Msg 42266 terug.

voorbeeldfout:

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.

Best practice: Vul de tabel met ten minste 100 rijen voordat u de vectorindex maakt. Voor ontwikkel- en testscenario's waarbij je minder rijen nodig hebt, VECTOR_SEARCH werkt het zonder index door een brute-force scan-aanpak te gebruiken. Deze methode verslechtert echter de prestaties bij grotere datasets.

DML-ondersteuning

Wanneer je een DiskANN-vectorindex aanmaakt met de nieuwste versie, is de tabel niet langer alleen-lezen. Je kunt data wijzigen door gebruik te maken van standaard data manipulation language (DML)-operaties, en de wijzigingen verschijnen automatisch in vectorzoekresultaten.

Deze mogelijkheid maakt vectorzoekopdrachten geschikt voor live, transactionele werkbelastingen waarbij gegevens in de loop van de tijd veranderen.

Opmerkingen bij gedrag

  • Voor DML-bewerkingen is het niet nodig om de vectorindex te verwijderen of opnieuw te bouwen.
  • Wijzigingen zijn zichtbaar voor vectorzoekquery's na de transactiedoorvoeringen.
  • Voor grootschalige gegevensvervanging (bijvoorbeeld het verwijderen van de meeste rijen en het invoegen van een geheel nieuwe set insluitingen), kunt u overwegen om de vectorindex na de gegevensbelasting te verwijderen en opnieuw te maken om een optimale zoekkwaliteit te garanderen.

Opmerking

DML-ondersteuning is alleen beschikbaar met vectorindexen die zijn gemaakt met de nieuwste versie. Eerdere versies vereisen dat tabellen alleen-lezen zijn of de configuratie van het ALLOW_STALE_VECTOR_INDEX databasebereik gebruiken.

Bewakingsvectorindexonderhoud

Vectorindexen voeren achtergrondonderhoud uit om DML-wijzigingen op te nemen. Gebruik de sys.dm_db_vector_indexes dynamische beheerweergave om de status van de index- en onderhoudstaak te bewaken.

Vectorindexen combineren met traditionele indexen

Vectorindexen werken samen met traditionele B-tree-indexen om optimale queryprestaties te bieden. Overweeg bij het gebruik van iteratieve filters VECTOR_SEARCHtraditionele indexen te maken voor kolommen die worden gebruikt in filterpredicaten.

Zie Iteratief filtergedrag voor gedetailleerde informatie over iteratief filtergedrag en hoe deze verschilt van eerdere versies.

Aanbeveling

De queryoptimalisatie selecteert automatisch de beste uitvoeringsstrategie (dichtstbijzijnde buurindex versus kNN-zoekopdracht). Gebruik de FORCE_ANN_ONLY tabelhint om het gebruik van de dichtstbijzijnde buurindex af te dwingen. Zie Tabelhints voor vectorzoekopdrachten voor meer informatie.

Voorbeeldscenario:

-- 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);

Prestatievoordeel:

Bij het uitvoeren van query's met iteratieve filters gebruikt de SQL Server-queryoptimalisatie beide indextypen:

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;

In deze query:

  • De vectorindex identificeert vergelijkbare insluitingen op basis van de queryvector
  • De traditionele index op (category) filters kandidaten efficiënt tijdens het iteratieve zoekproces

Deze samengestelde strategie kan de queryprestaties aanzienlijk verbeteren vergeleken met het gebruik van alleen een vectorindex, met name wanneer filterpredicaten een hoge selectiviteit hebben.

Richtlijnen voor gegevenskwaliteit en onderhoud voor vectorindexen

Vermijd gegevenssets met hoge dubbele insluitingen

Vectorindexering werkt het beste wanneer insluitingen diverse semantische inhoud vertegenwoordigen. Gebruik geen datasets met een hoog aandeel dubbele vectoren voor vectorindexering.

Hoge duplicatie kan leiden tot:

  • Slechte resultaatkwaliteit: dubbele vectoren verschijnen herhaaldelijk in resultaten, waardoor relevantere semantische overeenkomsten worden verdrongen.
  • Verminderde effectiviteit: dubbele insluitingen plaatsen betere buren, waardoor de bruikbaarheid van overeenkomsten zoeken wordt verlaagd.
  • Onnodig resourcegebruik: vectorindexen zijn duur om te bouwen en te onderhouden, en duplicaten voegen kosten toe zonder waarde toe te voegen.

Best practice: ontdubbeling van insluitingen voordat u een vectorindex maakt om zowel de prestaties als de resultaatkwaliteit te verbeteren.

Grootschalige scenario's voor gegevensvervanging

Vectorindexen ondersteunen invoegen, bijwerken en verwijderen. Wanneer je echter de meeste of alle embeddings vervangt—bijvoorbeeld door een dataset opnieuw in te bedden met een nieuw model—kan de bestaande index de nieuwe dataverdeling niet langer weerspiegelen.

In grootschalige vervangingsscenario's:

  • Vectorzoekopdrachten blijven geldige resultaten opleveren.
  • De kwaliteit van herinnering en rangschikking kunnen verslechteren, omdat de indexstructuur is gebouwd voor een andere embeddingverdeling.

Best practice: Wanneer u bijna volledige gegevensvervanging uitvoert (verwijderen en invoegen van nieuwe insluitingen), verwijdert u de vectorindex en maakt u deze opnieuw na het laden van de nieuwe gegevens. Het opnieuw maken van de index zorgt ervoor dat deze is geoptimaliseerd voor de nieuwe distributie van insluiten en herstelt voorspelbaar querygedrag.

Bekende problemen

Raadpleeg bekende problemen voor meer informatie.

Machtigingen

Je hebt toestemming nodig ALTER op tafel.

Voorbeelden

Download en importeer het Wikipedia-artikel met voorbeeld van vector-insluitingen .

Deze voorbeelden gaan uit van een tabel met een kolom wikipedia_articlestitle_vector van type vector die de titel-embeddings van Wikipedia-artikelen opslaat. De title_vector gebruikt een embeddingmodel zoals text-embedding-ada-002 of text-embedding-3-small, dat vectoren met 1.536 dimensies teruggeeft.

Voor meer voorbeelden, inclusief end-to-end oplossingen, zie de Azure SQL Database Vector Search Samples GitHub repo.

Voorbeeld 1

In het volgende voorbeeld wordt een vectorindex voor de title_vector kolom gemaakt met behulp van de cosine metrische waarde.

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'COSINE', TYPE = 'DISKANN');

Voorbeeld 2

Het volgende voorbeeld creëert een vectorindex op de title_vector kolom met behulp van de (negatieve) dot productmetriek. Het beperkt de paralleliteit tot 8 en slaat de vector op in de SECONDARY bestandsgroep.

CREATE VECTOR INDEX vec_idx
    ON [dbo].[wikipedia_articles] ([title_vector])
        WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
    ON [SECONDARY];

Voorbeeld 3

Dit voorbeeld gebruikt CREATE VECTOR INDEX en de gerelateerde VECTOR_SEARCH functie. De insluitingen worden gesimuleerd. In een realistisch scenario genereer je embeddings door een embeddingmodel en AI_GENERATE_EMBEDDINGS te gebruiken, of gebruik je een externe bibliotheek zoals OpenAI SDK.

Opmerking

De vectorindexen van de nieuwste versie vereisen minstens 100 rijen data voordat je de index kunt aanmaken. In dit voorbeeld worden 100 rijen ingevoegd om aan deze vereiste te voldoen. Zie Minimale gegevensvereisten voor meer informatie.

Het volgende codeblok laat zien CREATE VECTOR INDEX met gesimuleerde insluitingen:

  1. Schakel de previewfunctie in (vereist alleen voor SQL Server 2025; niet nodig voor Azure SQL Database of SQL Database in Fabric).
  2. Maak een voorbeeldtabel dbo.Articles met een kolom embedding met gegevenstypevector (5).
  3. Voeg 100 rijen met voorbeeldgegevens in met gesimuleerde insluitingsgegevens.
  4. Maak een vectorindex op dbo.Articles.embedding.
  5. Demonstreert de vector-overeenkomstenzoekopdracht met de VECTOR_SEARCH functie.
-- 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;

De syntaxis voor het uitvoeren van query's is afhankelijk van de vectorindexversie:

Vectorindexversie Voorbeeld van syntaxis
Nieuwste versie SELECT TOP (N) WITH APPROXIMATE Zonder parameter gebruiken TOP_N
Eerdere versies (afgeschaft) Parameter in TOP_N functie gebruiken VECTOR_SEARCH

Voor eerdere versie-indexen (afgeschafte syntaxis):

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;

Voorbeeld 4: Werken met DML-bewerkingen

De volgende voorbeelden tonen DML-operaties op een tabel met een vectorindex die is gemaakt met behulp van de nieuwste versie.

Rijen verwijderen

Als u rijen verwijdert, worden deze verwijderd uit zowel de zoekresultaten van de tabel als de vector.

DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;

Nadat de verwijderingsoperatie is voltooid, verschijnt de verwijderde rij niet meer in vectorzoekzoekopdrachten.

Nieuwe rijen invoegen

U kunt nieuwe rijen met insluitingen invoegen en ze worden onmiddellijk doorzoekbaar zonder de index opnieuw op te bouwen.

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)
);

Nieuw ingevoegde insluitingen worden automatisch opgenomen in de vectorindex en kunnen worden geretourneerd door volgende vectorzoekquery's.

Bestaande rijen bijwerken

Het bijwerken van vector- of niet-vectorkolommen wordt volledig ondersteund.

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;

Als je een vectorkolom bijwerkt, werkt de index dienovereenkomstig bij zodat toekomstige vectorzoekopdrachten de nieuwe embedding gebruiken.

Gebruik MERGE voor complexe bewerkingen

Met de MERGE instructie kunt u in één instructie invoeg-, update- en verwijderbewerkingen uitvoeren.

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;

De vectorindex wordt automatisch bijgewerkt om alle wijzigingen die door de MERGE instructie worden aangebracht weer te geven.