CREATE VECTOR INDEX (Transact-SQL)

Berlaku untuk: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Buat indeks perkiraan pada kolom vektor untuk meningkatkan kinerja pencarian tetangga terdekat. Untuk mempelajari lebih lanjut tentang cara kerja pengindeksan vektor dan pencarian vektor, serta perbedaan antara pencarian eksak dan perkiraan, lihat Indeks pencarian vektor dan vektor di SQL Database Engine.

Ketersediaan fitur

  • Indeks vektor dan VECTOR_SEARCH umumnya tersedia (GA) dalam Azure SQL Database, database SQL dalam Microsoft Fabric, dan Azure SQL Managed Instance dengan kebijakan pembaruanAlways-up-to-date.
  • Indeks vektor dan VECTOR_SEARCH merupakan fitur pratinjau di SQL Server 2025 (17.x) dan di Azure SQL Managed Instance dengan kebijakan pembaruan SQL Server 2025.

Peringatan

Pemberitahuan penghentian penggunaan: Indeks vektor yang dibuat menggunakan struktur data sebelumnya didukung dalam rilis saat ini tetapi akan dipensiunkan di versi mendatang. Untuk memastikan kompatibilitas di masa depan dan akses ke kemampuan pencarian vektor terbaru, migrasikan indeks vektor yang sudah ada dengan menggunakan langkah-langkah di bagian Migrasi dari versi indeks vektor sebelumnya .

Fitur pratinjau SQL Server 2025

Dalam SQL Server 2025 dan Azure SQL Managed Instance dalam kebijakan pembaruanSQL Server 2025, indeks vektor dan fungsi tersebut VECTOR_SEARCH masih dalam pratinjau dan dapat berubah. Untuk menggunakan fitur ini, Anda harus mengaktifkan PREVIEW_FEATURESkonfigurasi cakupan database.

Periksa batasan saat ini sebelum menggunakannya.

Nota

Versi terbaru dari indeks vektor tersedia dalam Azure SQL Database, database SQL dalam Microsoft Fabric, dan Azure SQL Managed Instance dengan kebijakan pembaruan Always-up-to-date.

Sintaksis

Konvensi sintaks Transact-SQL

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

Argumen

index_name

Nama indeks. Nama indeks harus unik dalam tabel tetapi tidak harus unik dalam database. Nama indeks harus mengikuti aturan pengidentifikasi.

benda

Tabel tempat indeks dibuat. Ini harus tabel dasar. Tampilan, tabel sementara, baik lokal maupun global, tidak didukung.

vector_column

Kolom yang akan digunakan untuk membuat indeks vektor. Ini harus berjenis vektor .

METRIK

String dengan nama metrik jarak yang akan digunakan untuk menghitung jarak antara dua vektor yang diberikan. Metrik jarak berikut didukung:

  • cosine - Jarak kosinus
  • euclidean - Jarak Euclidean
  • dot - (Negatif) Produk titik

TYPE

Jenis algoritma ANN yang digunakan untuk membangun indeks. Hanya DiskANN yang saat ini didukung. DiskANN adalah nilai default.

MAXDOP

Mengambil alih tingkat maksimum opsi konfigurasi paralelisme untuk operasi indeks. Untuk informasi selengkapnya, lihat konfigurasi server : tingkat paralelisme maksimum. Gunakan MAXDOP untuk membatasi tingkat paralelisme dan konsumsi sumber daya yang dihasilkan untuk operasi build indeks.

max_degree_of_parallelism dapat berupa:

  • 1

    Menonaktifkan pembuatan rencana paralel.

  • >1

    Membatasi tingkat paralelisme maksimum yang digunakan dalam operasi indeks paralel ke angka yang ditentukan atau kurang berdasarkan beban kerja sistem saat ini.

  • 0 (standar)

    Menggunakan tingkat paralelisme yang ditentukan di tingkat grup server, database, atau beban kerja, kecuali dikurangi berdasarkan beban kerja sistem saat ini.

    Untuk informasi selengkapnya, lihat Mengonfigurasi operasi indeks paralel.

    Operasi indeks paralel tidak tersedia di setiap edisi SQL Server. Untuk daftar fitur yang didukung oleh edisi di SQL Server, lihat Edisi dan fitur yang didukung dari SQL Server 2025.

Meningkatkan indeks vektor ke versi terbaru

Penting

Pemberitahuan penghentian: Rilis saat ini mendukung indeks vektor yang dibuat dengan menggunakan struktur data sebelumnya, tetapi versi mendatang akan menghentikan dukungan tersebut. Untuk memastikan kompatibilitas di masa depan dan akses ke kemampuan pencarian vektor terbaru, migrasikan indeks vektor yang sudah ada dengan menggunakan langkah-langkah berikut.

Indeks vektor yang baru dibuat secara otomatis menggunakan struktur data terbaru, yang menyediakan:

  • Dukungan DML penuh: Menghapus batasan sebelumnya yang membuat tabel yang diindeks vektor baca-saja setelah pembuatan indeks. Anda sekarang dapat melakukan INSERToperasi , UPDATE, DELETE, dan MERGE sambil mempertahankan fungsi indeks vektor dengan pemeliharaan indeks otomatis secara real-time.
  • Penyaringan iteratif: Menerapkan predikat dalam WHERE klausa selama proses pencarian vektor, bukan setelah pengambilan.
  • Optimizer-driven: Query optimizer secara otomatis menentukan apakah akan menggunakan indeks DiskANN atau pencarian kNN berdasarkan karakteristik query.
  • Kuantisasi lanjutan: Mengintegrasikan teknik kuantisasi vektor untuk memberikan efisiensi penyimpanan yang lebih baik dan performa kueri yang lebih cepat. Optimasi ini transparan bagi pengguna.

Untuk detail tentang batasan versi indeks vektor sebelumnya, lihat bagian Keterbatasan dan pertimbangan.

Migrasi dari versi indeks vektor sebelumnya

Untuk mengaktifkan kemampuan terbaru, Anda harus menghapus dan membuat ulang indeks vektor yang menggunakan versi sebelumnya. Bagian ini menjelaskan cara mengidentifikasi, memigrasikan, dan memverifikasi versi indeks vektor.

Langkah 1: Identifikasi indeks vektor yang ada

Gunakan kueri berikut untuk mengidentifikasi indeks vektor yang memerlukan migrasi:

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;
Cara menafsirkan hasilnya

Menggunakan versi terbaru

  • Sudah mendukung penyaringan iteratif, dukungan DML penuh, eksekusi berbasis optimizer, dan kuantisasi yang ditingkatkan.
  • Tidak diperlukan migrasi.

Dibuat menggunakan versi yang lebih lama

  • Menggunakan perilaku post-filter lama.
  • Tidak mendukung kemampuan pencarian vektor terbaru.
  • Migrasi sangat dianjurkan untuk memastikan kompatibilitas di masa depan.

Langkah 2: Jatuhkan dan buat ulang indeks vektor

Anda tidak bisa meningkatkan indeks vektor yang menggunakan format sebelumnya. Untuk mengaktifkan kemampuan DiskANN terbaru, hilangkan dan buat ulang indeks.

Peringatan

Dampak layanan: Menghilangkan indeks vektor segera menonaktifkan perkiraan pencarian vektor pada tabel yang terpengaruh hingga indeks dibuat ulang. Merencanakan migrasi selama jendela pemeliharaan untuk sistem produksi.

Menghilangkan indeks yang ada
DROP INDEX vec_idx ON dbo.wikipedia_articles;
Membuat ulang indeks
CREATE VECTOR INDEX vec_idx
    ON dbo.wikipedia_articles (title_vector)
    WITH (
        TYPE = 'DISKANN',
        METRIC = 'COSINE'
    );

Nota

Indeks vektor yang dibuat dengan menggunakan pernyataan saat ini CREATE VECTOR INDEX secara otomatis menggunakan format DiskANN terbaru. Tidak diperlukan opsi atau bendera tambahan.

Langkah 3: Verifikasi versi indeks

Setelah Anda membuat ulang indeks, pastikan bahwa menggunakan versi terbaru:

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

Kolom index_version harus ditampilkan 3 untuk versi terbaru.

Perilaku kesalahan dengan ketidaksesuaian versi

Jika Anda mencoba menggunakan TOP_N parameter dengan VECTOR_SEARCH indeks vektor versi terbaru, SQL Server mengembalikan kesalahan berikut:

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

Untuk mengatasi kesalahan ini, hapus TOP_N parameter dari VECTOR_SEARCH dan gunakan sintaks sebagai gantinya SELECT TOP (N) WITH APPROXIMATE . Untuk informasi mendetail, lihat Kesalahan menggunakan sintaksis warisan.

Batasan dan pertimbangan

Batasan versi indeks vektor sebelumnya

Versi indeks vektor sebelumnya memiliki keterbatasan sebagai berikut. Untuk memeriksa versi indeks Anda, lihat Memverifikasi versi indeks.

  • Hanya setelah penyaringan: Predikat hanya berlaku setelah pengambilan vektor, bukan selama proses pencarian. Perilaku ini dapat menghasilkan lebih sedikit baris yang dikembalikan dari yang diharapkan saat Anda menerapkan filter.

  • Tabel baca-saja: Tabel dengan indeks vektor bersifat baca-saja. Anda tidak dapat melakukan operasi DML (INSERT, UPDATE, , DELETEMERGE) setelah membuat indeks vektor. ALLOW_STALE_VECTOR_INDEX Gunakan konfigurasi cakupan database untuk mengaktifkan operasi DML jika Anda dapat mentolerir hasil pencarian kedaluarsa.

  • Penyetelan TOP_N manual: Anda harus mengatur TOP_N parameter secara VECTOR_SEARCH manual untuk mengkompensasi pasca-filter. Seringkali Anda membutuhkan nilai yang terlalu besar untuk mendapatkan jumlah hasil yang diinginkan.

  • Tabel harus memiliki indeks utama yang dikelompokkan pada kolom int .

Batasan saat ini (berlaku untuk versi terbaru juga)

Pratinjau saat ini memiliki batasan berikut:

  • Anda tidak bisa mempartisi indeks vektor.

  • Indeks vektor tidak direplikasi ke pelanggan.

  • Anda tidak bisa memotong tabel dengan indeks vektor dengan menggunakan TRUNCATE TABLE. Untuk menghapus semua data, jatuhkan indeks vektor terlebih dahulu, potong tabel, repopulasi dengan setidaknya 100 baris, lalu buat ulang indeks. Untuk informasi selengkapnya, lihat TRUNCATE TABLE pembatasan.

  • Indeks vektor tidak dapat diterapkan dengan DacPac. Anda dapat mendistribusikan database yang berisi indeks vektor dengan BACPAC mulai dari DacFx versi 170.5.96. Indeks vektor dibuat setelah data tabel dimuat, dan tabel terindeks harus berisi setidaknya 100 baris dengan nilai non-vektorNULL .

    Selama penerapan DACPAC hanya skema, penerapan dapat berhasil tanpa membuat indeks vektor jika tabel target berisi kurang dari 100 baris dengan nilai non-vektorNULL . DacFx tidak secara otomatis membuat indeks yang dilewati ketika baris ditambahkan kemudian. Setelah memuat setidaknya 100 baris yang memenuhi syarat, buat indeks vektor dengan menggunakan skrip pasca-deployment, publikasikan DACPAC lagi, atau jalankan CREATE VECTOR INDEX.

    Setelah impor atau deployment, verifikasi bahwa indeks vektor dibuat dengan melakukan sys.vector_indexeskueri .

    Sebagai solusi sebelum DacFx versi 170.5.96, hapus indeks vektor sebelum mengekspor database, dan buat ulang indeks setelah impor.

Persyaratan data minimum

Indeks vektor membutuhkan jumlah baris minimum dengan nilai non-vektorNULL sebelum Anda dapat membuat indeks.

  • Jumlah baris minimum: Tabel harus memiliki setidaknya 100 baris dengan nilai non-vektorNULL .
  • Perilaku error: Jika Anda mencoba membuat indeks vektor pada tabel dengan kurang dari 100 baris, operasi gagal dan mengembalikan error Msg 42266.

Contoh kesalahan:

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.

Praktik terbaik: Isi tabel dengan setidaknya 100 baris sebelum membuat indeks vektor. Untuk skenario pengembangan dan pengujian di mana Anda membutuhkan lebih sedikit baris, VECTOR_SEARCH ini bekerja tanpa indeks dengan menggunakan pendekatan pemindaian brute-force. Namun, metode ini menurunkan performa dengan dataset yang lebih besar.

Dukungan DML

Ketika Anda membuat indeks vektor DiskANN menggunakan versi terbaru, tabel tersebut tidak lagi hanya-baca. Anda dapat memodifikasi data dengan menggunakan operasi bahasa manipulasi data standar (DML), dan perubahan tersebut secara otomatis muncul dalam hasil pencarian vektor.

Kemampuan ini membuat pencarian vektor cocok untuk beban kerja langsung dan transaksi di mana data berubah dari waktu ke waktu.

Catatan perilaku

  • Operasi DML tidak memerlukan penghapusan atau pembangunan kembali indeks vektor.
  • Perubahan terlihat oleh kueri pencarian vektor setelah transaksi diterapkan.
  • Untuk penggantian data skala besar (misalnya, menghapus sebagian besar baris dan menyisipkan sekumpulan penyematan yang sama sekali baru), pertimbangkan untuk menghilangkan dan membuat ulang indeks vektor setelah pemuatan data untuk memastikan kualitas pencarian yang optimal.

Nota

Dukungan DML hanya tersedia dengan indeks vektor yang dibuat menggunakan versi terbaru. Versi sebelumnya mengharuskan tabel bersifat baca-saja atau menggunakan ALLOW_STALE_VECTOR_INDEX konfigurasi cakupan database.

Memantau pemeliharaan indeks vektor

Indeks vektor melakukan pemeliharaan latar belakang untuk menggabungkan perubahan DML. Gunakan tampilan manajemen dinamis sys.dm_db_vector_indexes untuk memantau status tugas kesehatan dan pemeliharaan indeks.

Menggabungkan indeks vektor dengan indeks tradisional

Indeks vektor bekerja bersama indeks pohon B tradisional untuk memberikan performa kueri yang optimal. Saat menggunakan pemfilteran berulang dengan VECTOR_SEARCH, pertimbangkan untuk membuat indeks tradisional pada kolom yang digunakan dalam predikat filter.

Untuk informasi terperinci tentang perilaku pemfilteran berulang dan perbedaannya dengan versi sebelumnya, lihat Perilaku pemfilteran berulang.

Petunjuk / Saran

Pengoptimal kueri secara otomatis memilih strategi eksekusi terbaik (perkiraan indeks tetangga terdekat vs. pencarian kNN). Untuk memaksa penggunaan perkiraan indeks tetangga terdekat, gunakan FORCE_ANN_ONLY petunjuk tabel. Untuk informasi selengkapnya, lihat Petunjuk tabel untuk pencarian vektor.

Contoh skenario:

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

Manfaat performa:

Saat menjalankan kueri dengan pemfilteran berulang, pengoptimal kueri SQL Server menggunakan kedua jenis indeks:

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;

Dalam kueri ini:

  • Indeks vektor mengidentifikasi penyematan serupa berdasarkan vektor kueri
  • Indeks tradisional pada (category) filter kandidat secara efisien selama proses pencarian berulang

Strategi komposit ini dapat meningkatkan performa kueri secara signifikan dibandingkan dengan hanya menggunakan indeks vektor, terutama ketika predikat filter memiliki selektivitas tinggi.

Panduan kualitas dan pemeliharaan data untuk indeks vektor

Hindari himpunan data dengan penyematan duplikat tinggi

Pengindeksan vektor berfungsi paling baik saat penyematan mewakili beragam konten semantik. Jangan gunakan dataset dengan proporsi vektor duplikat yang tinggi untuk pengindeksan vektor.

Duplikasi tinggi dapat menyebabkan:

  • Kualitas hasil yang buruk: Vektor duplikat muncul berulang kali dalam hasil, memadati kecocokan semantik yang lebih relevan.
  • Pengurangan efektivitas: Penyematan duplikat menggantikan tetangga yang lebih baik, menurunkan kegunaan pencarian kesamaan.
  • Penggunaan sumber daya yang tidak perlu: Indeks vektor mahal untuk membangun dan memelihara, dan duplikat menambahkan biaya tanpa menambahkan nilai.

Praktik terbaik: Menyematkan penyematan Deduplikasi sebelum membuat indeks vektor untuk meningkatkan performa dan kualitas hasil.

Skenario penggantian data skala besar

Indeks vektor mendukung penyisipan, pembaruan, dan penghapusan. Namun, ketika Anda mengganti sebagian besar atau semua embedding—misalnya, melakukan re-embedding dataset dengan model baru—indeks yang ada mungkin tidak lagi mencerminkan distribusi data baru.

Dalam skenario penggantian skala besar:

  • Kueri pencarian vektor terus mengembalikan hasil yang valid.
  • Kualitas recall dan peringkat mungkin menurun, karena struktur indeks dibuat untuk distribusi embedding yang berbeda.

Praktik terbaik: Saat melakukan penggantian data yang hampir lengkap (hapus dan sisipkan penyematan baru), jatuhkan dan buat ulang indeks vektor setelah memuat data baru. Membuat ulang indeks memastikan indeks dioptimalkan untuk distribusi penyematan baru dan memulihkan perilaku kueri yang dapat diprediksi.

Masalah yang diketahui

Untuk informasi selengkapnya, tinjau Masalah yang diketahui.

Hak akses

Kamu butuh ALTER izin di atas meja.

Contoh

Unduh dan impor artikel Wikipedia dengan sampel penyematan vektor .

Contoh-contoh ini mengasumsikan tabel yang dinamai wikipedia_articles dengan kolom title_vector tipe yang vector menyimpan penyisipan judul artikel Wikipedia. Model ini title_vector menggunakan model embedding seperti text-embedding-ada-002 atau text-embedding-3-small, yang mengembalikan vektor dengan 1.536 dimensi.

Untuk contoh lebih lanjut, termasuk solusi end-to-end, lihat repo GitHub Azure SQL Database Vector Search Samples.

Contoh 1

Contoh berikut membuat indeks vektor pada title_vector kolom menggunakan cosine metrik.

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

Contoh 2

Contoh berikut membuat indeks vektor pada title_vector kolom menggunakan metrik produk (negatif dot ). Ia membatasi paralelisme hingga 8 dan menyimpan vektor di SECONDARY filegroup.

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

Contoh 3

Contoh ini menggunakan CREATE VECTOR INDEX dan fungsi terkait VECTOR_SEARCH . Penyematan dititipkan. Dalam skenario dunia nyata, hasilkan embedding menggunakan model embedding dan AI_GENERATE_EMBEDDINGS, atau gunakan pustaka eksternal seperti OpenAI SDK.

Nota

Indeks vektor versi terbaru memerlukan setidaknya 100 baris data sebelum Anda dapat membuat indeks. Contoh ini menyisipkan 100 baris untuk memenuhi persyaratan ini. Untuk informasi selengkapnya, lihat Persyaratan data minimum.

Blok kode berikut menunjukkan CREATE VECTOR INDEX dengan penyematan tiruan:

  1. Aktifkan fitur pratinjau (hanya diperlukan untuk SQL Server 2025; tidak diperlukan untuk Azure SQL Database atau database SQL di Fabric).
  2. Buat tabel dbo.Articles sampel dengan kolom embedding dengan vektor tipe data(5).
  3. Sisipkan 100 baris data sampel dengan data penyematan tiruan.
  4. Buat indeks vektor pada dbo.Articles.embedding.
  5. Menunjukkan pencarian kesamaan vektor dengan VECTOR_SEARCH fungsi .
-- 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;

Sintaks untuk kueri bergantung pada versi indeks vektor:

Versi indeks vektor Contoh sintaksis
Versi terbaru Gunakan SELECT TOP (N) WITH APPROXIMATE tanpa TOP_N parameter
Versi sebelumnya (tidak digunakan lagi) Gunakan TOP_N parameter dalam VECTOR_SEARCH fungsi

Untuk indeks versi yang lebih lama (sintaksis yang tidak digunakan lagi):

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;

Contoh 4: Bekerja dengan operasi DML

Contoh berikut menunjukkan operasi DML pada tabel dengan indeks vektor yang dibuat menggunakan versi terbaru.

Menghapus baris

Menghapus baris akan menghapusnya dari tabel dan hasil pencarian vektor.

DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;

Setelah operasi penghapusan selesai, baris yang dihapus tidak lagi muncul dalam kueri pencarian vektor.

Sisipkan baris baru

Anda dapat menyisipkan baris baru dengan penyematan, dan baris tersebut menjadi segera dapat dicari tanpa membangun ulang indeks.

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

Penyematan yang baru disisipkan secara otomatis dimasukkan ke dalam indeks vektor dan dapat dikembalikan oleh kueri pencarian vektor berikutnya.

Memperbarui baris yang sudah ada

Memperbarui kolom vektor atau non-vektor didukung sepenuhnya.

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;

Jika Anda memperbarui kolom vektor, indeks akan diperbarui sesuai sehingga pencarian vektor di masa depan menggunakan embedding baru.

Gunakan MERGE untuk operasi yang kompleks

Pernyataan ini MERGE memungkinkan Anda melakukan operasi sisipkan, perbarui, dan hapus dalam satu pernyataan.

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 vektor secara otomatis diperbarui untuk mencerminkan semua perubahan yang dilakukan oleh pernyataan tersebut MERGE .