Bagikan melalui


VECTOR_SEARCH (Transact-SQL) (Pratinjau)

Berlaku untuk: SQL Server 2025 (17.x) Database SQL Azure SQL databasedi Microsoft Fabric

Cari vektor yang mirip dengan vektor kueri tertentu menggunakan perkiraan algoritma pencarian vektor tetangga terdekat. Untuk mempelajari selengkapnya tentang cara kerja pengindeksan vektor dan pencarian vektor, dan perbedaan antara pencarian yang tepat dan perkiraan, lihat Indeks pencarian vektor dan vektor di Mesin Database SQL.

Database Azure SQL dan database SQL di Fabric

Fitur ini dalam pratinjau. Pastikan untuk memeriksa batasan saat ini sebelum menggunakannya.

Nota

Sebagai fitur pratinjau, teknologi yang tersaji dalam artikel ini tunduk pada Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure.

Penting

Untuk performa optimal dan mengakses kemampuan pencarian vektor terbaru, gunakan indeks vektor yang dibuat dengan versi terbaru. Untuk informasi selengkapnya tentang memutakhirkan indeks yang ada dan membandingkan versi, lihat MEMBUAT INDEKS VECTOR - Meningkatkan indeks vektor ke versi terbaru.

Ketersediaan regional

Fitur ini sedang disebarkan di Azure SQL Database dan database SQL di Microsoft Fabric. Selama peluncuran, ketersediaan dan perilaku mungkin bervariasi menurut wilayah dan menurut versi indeks. Jika fitur atau sintaksis tidak tersedia, fitur tersebut akan tersedia secara otomatis saat penyebaran selesai. Untuk status ketersediaan regional saat ini, lihat Ketersediaan fitur menurut wilayah.

Peringatan

Pemberitahuan penghentian: TOP_N Parameter di VECTOR_SEARCH tidak digunakan lagi dan dipertahankan hanya untuk kompatibilitas mundur dengan indeks vektor versi sebelumnya. Implementasi baru harus menggunakan SELECT TOP (N) WITH APPROXIMATE sintaks sebagai gantinya. Untuk informasi selengkapnya, lihat Sintaks.

Fitur Pratinjau SQL Server 2025

Di SQL Server 2025, fungsi ini dalam pratinjau dan dapat berubah. Untuk menggunakan fitur ini, Anda harus mengaktifkan PREVIEW_FEATURESkonfigurasi cakupan database.

Pastikan untuk memeriksa batasan saat ini sebelum menggunakannya.

Nota

Versi terbaru Indeks Vektor hanya tersedia di Azure SQL Database dan database SQL di Microsoft Fabric saat ini.

Penyempurnaan utama dengan indeks vektor terbaru

Indeks vektor yang dibuat dengan versi terbaru memperkenalkan peningkatan signifikan:

  • Dukungan DML penuh: Menghapus batasan sebelumnya yang membuat tabel yang diindeks vektor baca-saja setelah pembuatan indeks. Anda sekarang dapat melakukan operasi INSERT, UPDATE, DELETE, dan MERGE sambil mempertahankan fungsionalitas indeks vektor dengan pemeliharaan indeks otomatis secara real time
  • Pemfilteran berulang: Predikat dalam klausul WHERE diterapkan selama proses pencarian vektor, bukan setelah pengambilan
  • Berbasis pengoptimal: Pengoptimal kueri secara otomatis menentukan apakah akan menggunakan indeks DiskANN atau pencarian kNN berdasarkan karakteristik kueri
  • Kuantisasi tingkat lanjut: Teknik kuantisasi vektor telah diintegrasikan untuk memberikan efisiensi penyimpanan yang lebih baik dan performa kueri yang lebih cepat, dengan pengoptimalan ini transparan bagi pengguna

Syntax

Konvensi sintaks Transact-SQL

Dengan versi terbaru Indeks Vektor:

Penting

Saat mengkueri tabel yang menggunakan versi indeks vektor terbaru, perkiraan pencarian vektor harus menggunakan sintaksIS PERKIRAAN TOP (N). Persyaratan sintaks ini menunjukkan bahwa kueri secara eksplisit meminta perkiraan hasil tetangga terdekat.

SELECT TOP (N) WITH APPROXIMATE
    column_list
FROM VECTOR_SEARCH(
        TABLE = object [ AS source_table_alias ]
        , COLUMN = vector_column
        , SIMILAR_TO = query_vector
        , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    ) [ AS result_table_alias ]
[ WHERE predicate ]
ORDER BY distance;

Dengan versi Indeks Vektor yang lebih lama:

VECTOR_SEARCH(
    TABLE = object [ AS source_table_alias ]
    , COLUMN = vector_column
    , SIMILAR_TO = query_vector
    , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    , TOP_N = k
) [ AS result_table_alias ]

Penting

Parameter TOP_N tidak didukung dengan indeks vektor versi terbaru. Gunakan sintaks yang ditunjukkan SELECT TOP (N) WITH APPROXIMATE di atas. Untuk informasi selengkapnya, lihat Kesalahan menggunakan sintaksis warisan.

Arguments

TABEL = objek [AS source_table_alias]

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

KOLOM = vector_column

Kolom vektor tempat pencarian dilakukan. Kolom harus berupa jenis data vektor .

SIMILAR_TO = query_vector

Vektor yang digunakan untuk pencarian. Ini harus berupa variabel atau kolom jenis vektor .

METRIK = { 'kosinus' | 'titik' | 'euclidean' }

Metrik jarak yang digunakan untuk menghitung jarak antara vektor kueri dan vektor di kolom yang ditentukan. Indeks ANN (Perkiraan Tetangga Terdekat) digunakan hanya jika indeks ANN yang cocok, dengan metrik yang sama dan pada kolom yang sama, ditemukan. Jika tidak ada indeks ANN yang kompatibel, peringatan akan dimunculkan dan algoritma kNN (k-tetangga terdekat) digunakan.

TOP_N = <k>

Peringatan

Parameter ini tidak digunakan lagi dan dipertahankan hanya untuk kompatibilitas mundur dengan indeks vektor versi sebelumnya. Untuk indeks versi terbaru, gunakan SELECT TOP (N) WITH APPROXIMATE sintaks. Implementasi baru harus menggunakan sintaks terbaru.

Jumlah maksimum vektor serupa yang harus dikembalikan. Ini harus bilangan bulat positif. Parameter ini tidak didukung dengan indeks vektor yang dibuat menggunakan versi terbaru.

result_table_alias

Alias digunakan untuk mereferensikan kumpulan hasil.

Mengembalikan tataan hasil

Tataan hasil yang VECTOR_SEARCH dikembalikan oleh fungsi meliputi:

  • Semua kolom dari tabel yang ditentukan dalam TABLE argumen.

  • Kolom tambahan bernama distance, yang mewakili jarak antara vektor dalam kolom yang ditentukan oleh COLUMN argumen dan vektor yang disediakan dalam SIMILAR_TO argumen.

Kolom jarak dihasilkan oleh fungsi itu VECTOR_SEARCH sendiri, sementara semua kolom lain berasal dari tabel yang dirujuk dalam TABLE argumen.

Jika Anda menggunakan alias untuk tabel dalam TABLE argumen, Anda harus menggunakan alias yang sama untuk mereferensikan kolomnya dalam SELECT pernyataan. Anda tidak dapat menggunakan alias yang ditetapkan ke untuk VECTOR_SEARCH mereferensikan kolom dari tabel yang ditentukan dalam TABLE. Perilaku ini lebih mudah dipahami jika Anda memikirkan kumpulan hasil yang dibangun dengan mengambil output VECTOR_SEARCH dan menggabungkannya dengan data tabel.

Jika tabel yang ditentukan dalam TABLE argumen sudah berisi kolom bernama distance, perilakunya akan mirip dengan gabungan SQL di antara dua tabel yang berbagi nama kolom. Dalam kasus seperti itu, Anda harus menggunakan alias tabel untuk membedakan referensi kolom—jika tidak, kesalahan akan muncul.

Penting

Kolom distance adalah satu-satunya kunci pengurutan yang valid untuk perkiraan hasil pencarian vektor.

Limitations

  • Urutan naik saja: Kolom distance harus diurutkan dalam urutan naik (ASC). Urutan turun (DESC) tidak didukung.

Perilaku khusus versi

Perilaku VECTOR_SEARCH bervariasi tergantung pada versi indeks vektor.

Versi indeks vektor sebelumnya

Nota

Batasan ini hanya berlaku untuk indeks vektor yang dibuat dengan versi sebelumnya. Migrasikan ke versi terbaru untuk mengaktifkan pemfilteran berulang. Lihat Migrasi dari versi indeks vektor sebelumnya.

Hanya pasca-pemfilteran: Pencarian vektor terjadi sebelum menerapkan predikat apa pun. Predikat tambahan diterapkan hanya setelah vektor yang paling mirip dikembalikan. Sampel berikut mengembalikan 10 baris teratas dengan penyematan yang paling mirip dengan vektor @qvkueri , lalu menerapkan predikat yang ditentukan dalam WHERE klausul. Jika tidak ada dari 10 baris yang terkait dengan vektor yang dikembalikan oleh pencarian vektor yang memiliki accepted kolom sama dengan 1, hasilnya kosong.

SELECT TOP (10) s.id,
                s.title,
                r.distance
FROM VECTOR_SEARCH(
         TABLE = dbo.sessions AS s,
         COLUMN = embedding,
         SIMILAR_TO = @qv,
         METRIC = 'cosine',
         TOP_N = 10
     ) AS r
WHERE accepted = 1
ORDER BY r.distance;

Pembatasan umum

VECTOR_SEARCH tidak dapat digunakan dalam isi tampilan.

Examples

Penting

Saat mengkueri tabel yang menggunakan versi indeks vektor terbaru, perkiraan pencarian vektor harus menggunakan TOP (N) WITH APPROXIMATE sintaks. Persyaratan sintaks ini menunjukkan bahwa kueri secara eksplisit meminta perkiraan hasil tetangga terdekat.

Contoh berikut menemukan 10 artikel Pink Floyd music style paling mirip dalam wikipedia_articles_embeddings tabel.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);

SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles_embeddings AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
ORDER BY r.distance;

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

Petunjuk / Saran

Untuk menentukan versi indeks vektor Anda, lihat Migrasi dari versi indeks vektor sebelumnya.

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

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);

SELECT TOP (10)
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles_embeddings AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 10  -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
    ) AS r
ORDER BY r.distance;

Nota

TOP_N Menggunakan parameter dengan indeks vektor versi terbaru mengembalikan kesalahan Msg 42274. Untuk informasi mendetail, lihat Kesalahan menggunakan sintaksis warisan di bagian Perilaku yang diharapkan.

B. Menyelesaikan alur kerja dengan pembuatan indeks

Contoh end-to-end dasar menggunakan CREATE VECTOR INDEX dan fungsi terkait VECTOR_SEARCH . Penyematan dititipkan. Dalam skenario dunia nyata, penyematan dihasilkan menggunakan model penyematan dan AI_GENERATE_EMBEDDINGS, atau pustaka eksternal seperti OpenAI SDK.

Nota

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

Blok kode berikut menunjukkan VECTOR_SEARCH fungsi dengan penyematan tiruan:

  1. Mengaktifkan fitur pratinjau (diperlukan untuk SQL Server 2025 saja; 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  -- Deprecated: Use SELECT TOP (N) WITH APPROXIMATE instead
    ) AS s
ORDER BY s.distance, t.title;

C. Pencarian vektor dengan pemfilteran berulang

Contoh berikut menunjukkan pemfilteran berulang dengan indeks vektor versi terbaru. Kueri menemukan artikel serupa saat menerapkan predikat selama proses pencarian.

Dengan indeks versi terbaru, predikat dalam klausul WHERE diterapkan selama proses pencarian vektor (tidak setelahnya). Mesin terus mencari sampai menemukan 5 baris yang memenuhi syarat yang cocok dengan semua kriteria:

  • Kesamaan vektor dengan "algoritma pembelajaran mesin"
  • Kategori sama dengan 'Teknologi'
  • Status yang diterbitkan sama dengan 1

Ini memastikan Anda mendapatkan tepat 5 hasil (jika ada) tanpa menyetel parameter pencarian secara manual. Untuk perbandingan terperinci antara versi sebelumnya dan terbaru, lihat Perilaku pemfilteran berulang di bagian Perilaku yang diharapkan.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning algorithms' USE MODEL Ada2Embeddings);

SELECT TOP (5) WITH APPROXIMATE
    t.id,
    t.title,
    t.category,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = content_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
WHERE t.category = 'Technology'
  AND t.published = 1
ORDER BY r.distance;

Nota

Operasi SQL tertentu seperti GROUP BY, fungsi agregat, dan fungsi jendela memerlukan pola subkueri. Untuk detailnya, lihat Menggabungkan pencarian vektor dengan operasi SQL lainnya.

D. Gabungan multi-tabel dengan INNER JOIN

Sampel berikut menunjukkan INNER JOIN dengan pemfilteran pada beberapa tabel. Gunakan saat penyematan disimpan dalam tabel terpisah dari data entitas utama.

-- Assuming a schema with separate tables for articles and embeddings
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence and machine learning' USE MODEL Ada2Embeddings);

SELECT TOP (10) WITH APPROXIMATE
    a.id,
    a.title,
    a.category,
    vs.distance
FROM wikipedia_articles a
INNER JOIN VECTOR_SEARCH(
    TABLE = wikipedia_articles_embeddings AS e,
    COLUMN = content_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS vs ON a.id = e.article_id
WHERE e.approved = 1                           -- Iterative filter on embedding table
  AND a.category IN ('Technology', 'Science')  -- Filter on main table
  AND a.views > 50000
ORDER BY vs.distance;

Fitur utama dari contoh ini:

  • Cakupan alias tabel: Alias e dari TABLE = wikipedia_articles_embeddings AS e tersedia dalam klausa WHERE untuk pemfilteran berulang dengan indeks versi terbaru

Perilaku yang diharapkan

Kesalahan menggunakan sintaksis warisan

Jika Anda mencoba menggunakan TOP_N parameter saat VECTOR_SEARCH mengkueri tabel dengan 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:

  1. TOP_N Menghapus parameter dari VECTOR_SEARCH fungsi
  2. Gunakan SELECT TOP (N) WITH APPROXIMATE sintaks sebagai gantinya

Salah (menghasilkan kesalahan dengan indeks versi terbaru):

SELECT TOP (10) 
    t.id,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 10  -- This parameter causes the error with latest version indexes
    ) AS r;

Benar (berfungsi dengan indeks versi terbaru):

SELECT TOP (10) WITH APPROXIMATE  -- Specify TOP and WITH APPROXIMATE here
    t.id,
    r.distance
FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
        -- No TOP_N parameter
    ) AS r
ORDER BY r.distance;

Perilaku pemfilteran berulang

Versi terbaru memperkenalkan peningkatan signifikan atas versi indeks vektor sebelumnya:

Aspek Versi sebelumnya Versi terbaru
Aplikasi predikat Predikat relasional diterapkan setelah pencarian vektor mengembalikan jumlah tetap tetangga terdekat (hanya pasca-pemfilteran) Predikat relasional diterapkan selama proses pencarian vektor (pemfilteran berulang)
Kelengkapan hasil Kueri dapat mengembalikan lebih sedikit baris—atau tanpa baris—jika tetangga terdekat awal tidak memenuhi filter, bahkan saat baris yang memenuhi syarat ada Kueri mengembalikan jumlah baris yang diharapkan saat data yang memenuhi syarat ada, tanpa penyetelan manual atau penulisan ulang kueri
Penyetelan TOP (N) Pengguna sering harus menebak atau melakukan oversample nilai TOP (N) untuk mengimbangi pasca-pemfilteran Tidak perlu menebak nilai TOP (N). Mesin mencari sampai cukup baris yang memenuhi syarat ditemukan atau ruang pencarian habis
Pengoptimalan kueri Tidak berlaku SQL Server secara otomatis memilih strategi eksekusi yang paling efisien, termasuk beralih antara pencarian indeks vektor dan pemindaian kNN jika sesuai

Untuk contoh praktis pemfilteran berulang, lihat Contoh C: Pencarian vektor dengan pemfilteran berulang.

Persyaratan klausul ORDER BY

Saat menggunakan SELECT TOP (N) WITH APPROXIMATE, klausul ORDER BY memiliki persyaratan khusus:

  • ORDER BY harus ada: Kueri tanpa klausa ORDER BY gagal dengan kesalahan .
  • Hanya kolom jarak yang diizinkan: Klausa ORDER BY hanya harus mereferensikan kolom jarak dari kumpulan hasil VECTOR_SEARCH. Termasuk kolom tambahan gagal dengan kesalahan. Untuk mengurutkan menurut beberapa kolom, gunakan pola subkueri yang dijelaskan dalam Beberapa kolom ORDER BY.
  • Urutan naik saja: Kolom jarak harus diurutkan dalam urutan naik (ASC). Urutan turun (DESC) tidak didukung.

ORDER BY yang valid:

SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance;  -- ✓ Valid

Pola ORDER BY tidak valid:

-- Missing ORDER BY
SELECT TOP (10) WITH APPROXIMATE
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r;
-- ✗ Error Msg 42248: APPROXIMATE cannot be used in a query without ORDER BY

-- Multiple columns in ORDER BY
SELECT TOP (10) WITH APPROXIMATE
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
INNER JOIN products t ON t.id = r.id
ORDER BY r.distance, t.title;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY 
-- on distance column ascending, and no other columns

-- Descending order
SELECT TOP (10) WITH APPROXIMATE
    r.distance
FROM VECTOR_SEARCH(
    TABLE = products,
    COLUMN = embedding,
    SIMILAR_TO = @query_vector,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance DESC;
-- ✗ Error Msg 42271: TOP WITH APPROXIMATE and VECTOR_SEARCH requires ORDER BY 
-- on distance column ascending, and no other columns

Perilaku tanpa indeks vektor

VECTOR_SEARCH dapat menjalankan kueri bahkan ketika tidak ada indeks vektor pada kolom target. Tanpa indeks, kueri melakukan pemindaian tabel penuh (pencarian k-tetangga terdekat (kNN) untuk menghitung jarak untuk semua baris.

Perilaku kueri tanpa TOP WITH APPROXIMATE

Saat menggunakan VECTOR_SEARCH tanpa SELECT TOP (N) WITH APPROXIMATE, perilaku kueri bergantung pada keberadaan TOP klausul dan ORDER BY :

  • Tidak ada TOP, tidak ada ORDER BY, atau ORDER BY non-distance: Pemindaian tabel penuh (pencarian brute-force) yang menghitung dan mengembalikan jarak untuk semua baris
  • TOP (tidak ada PERKIRAAN) dengan jarak ORDER BY: Dijalankan sebagai pencarian kNN (k-tetangga terdekat), yang merupakan pencarian tetangga terdekat yang tepat

Contoh - Pemindaian penuh dengan kolom jarak:

-- Returns all rows with calculated distances
SELECT 
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY t.id;  -- Not ordering by distance

Contoh - pencarian kNN (tetangga terdekat yang tepat):

-- Returns exact top 10 nearest neighbors using kNN
SELECT TOP (10)
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance;  -- No WITH APPROXIMATE = exact kNN

Menggunakan SELECT TOP (N) WITH APPROXIMATE tanpa VECTOR_SEARCH fungsi dalam kueri menghasilkan kesalahan. Klausa WITH APPROXIMATEVECTOR_SEARCH memerlukan fungsi untuk hadir.

Salah - Kueri ini gagal:

-- Error: WITH APPROXIMATE requires VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
    id,
    title,
    VECTOR_DISTANCE('cosine', title_vector, @qv) AS distance
FROM dbo.wikipedia_articles
WHERE title_vector IS NOT NULL
ORDER BY VECTOR_DISTANCE('cosine', title_vector, @qv);

Benar - Gunakan VECTOR_SEARCH:

-- Correct: WITH APPROXIMATE with VECTOR_SEARCH
SELECT TOP (10) WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.wikipedia_articles AS t,
    COLUMN = title_vector,
    SIMILAR_TO = @qv,
    METRIC = 'cosine'
) AS r
ORDER BY r.distance;

POTONG pembatasan TABLE

Tabel dengan indeks vektor tidak dapat dipotong menggunakan TRUNCATE TABLE. Untuk menghapus semua data dari tabel yang diindeks vektor:

  1. Menghilangkan indeks vektor
  2. Memotong tabel
  3. Mengisi ulang tabel dengan setidaknya 100 baris
  4. Membuat ulang indeks vektor

Contoh alur kerja:

-- Step 1: Drop the vector index
DROP INDEX idx_vector ON wikipedia_articles;

-- Step 2: Truncate the table
TRUNCATE TABLE wikipedia_articles;

-- Step 3: Repopulate with data (at least 100 rows)
-- ... insert operations ...

-- Step 4: Recreate the vector index
CREATE VECTOR INDEX idx_vector 
ON wikipedia_articles(title_vector)
WITH (METRIC = 'cosine');

Anda dapat menggunakan petunjuk tabel dengan VECTOR_SEARCH fungsi untuk mengontrol perilaku eksekusi kueri. FORCE_ANN_ONLY Petunjuk tabel memaksa pengoptimal kueri untuk hanya menggunakan perkiraan indeks tetangga terdekat (ANN), bahkan ketika pengoptimal mungkin memilih strategi eksekusi yang berbeda.

Sintaks:

FROM VECTOR_SEARCH(
    TABLE      = table_name,
    COLUMN     = column_name,
    SIMILAR_TO = vector_value,
    METRIC     = 'metric_name'
) AS alias WITH (FORCE_ANN_ONLY)

Example:

Contoh berikut memaksa penggunaan perkiraan indeks tetangga terdekat untuk kueri pencarian vektor:

DECLARE @qembedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);

SELECT TOP 50 WITH APPROXIMATE
    t.id,
    t.title,
    r.distance
FROM VECTOR_SEARCH(
    TABLE      = dbo.wikipedia_articles AS t,
    COLUMN     = title_vector,
    SIMILAR_TO = @qembedding,
    METRIC     = 'cosine'
) AS r WITH (FORCE_ANN_ONLY)
ORDER BY r.distance;

Gunakan FORCE_ANN_ONLY saat Anda ingin memastikan kueri menggunakan perkiraan strategi indeks tetangga terdekat, mengesampingkan pemilihan strategi otomatis pengoptimal.

Nota

Menggunakan FORCE_ANN_ONLY memerlukan keduanya:

  • Indeks vektor pada kolom target
  • SELECT TOP (N) WITH APPROXIMATE dalam kueri

Jika salah satu persyaratan hilang, kueri gagal karena tidak dapat menggunakan perkiraan strategi tetangga terdekat yang dipaksa petunjuk.

Menggabungkan pencarian vektor dengan operasi SQL lainnya

Fungsi VECTOR_SEARCH dengan TOP (N) WITH APPROXIMATE memiliki persyaratan khusus untuk penggunaannya. Beberapa operasi SQL dapat digunakan langsung dengan pencarian vektor, sementara yang lain memerlukan pola subkueri.

Operasi yang memerlukan pola subkueri

Saat Anda perlu melakukan operasi yang tidak kompatibel langsung dengan TOP (N) WITH APPROXIMATE, gunakan pencarian vektor dalam subkueri (kueri dalam), lalu terapkan operasi Anda di kueri luar. Pola ini mempertahankan manfaat performa dari perkiraan pencarian vektor sambil mengaktifkan fungsionalitas SQL penuh.

Petunjuk / Saran

Pola subkueri berfungsi untuk operasi apa pun yang tidak dapat dikombinasikan langsung dengan TOP (N) WITH APPROXIMATE. Terapkan pencarian vektor di kueri dalam, lalu gunakan operasi SQL apa pun di kueri luar.

Skenario umum

Tabel berikut mencantumkan operasi yang memerlukan pola subkueri:

Pengoperasian Contoh kasus penggunaan
Kelompokkan menurut Menghitung statistik per kategori
Fungsi agregat Keseluruhan COUNT, AVG, MIN, MAX di seluruh hasil
Fungsi jendela ROW_NUMBER, RANK, DENSE_RANK, NTILE
Mengatur operasi UNION, UNION ALL, EXCEPT, INTERSECT
Beberapa kolom ORDER BY Urutkan menurut jarak, lalu menurut tanggal atau judul
NYATA Menghapus hasil duplikat
TERAPKAN SILANG Menerapkan pencarian vektor per baris dari tabel luar

FUNGSI GROUP BY dan agregat

Contoh berikut menemukan jarak rata-rata artikel pencocokan teratas menurut kategori. Untuk contoh ini, category kolom telah ditambahkan ke wikipedia_articles tabel untuk mengklasifikasikan artikel.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);

SELECT 
    category,
    COUNT(*) AS article_count,
    AVG(distance) AS avg_distance,
    MIN(distance) AS closest_match
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
GROUP BY category
ORDER BY avg_distance;

Fungsi jendela

Contoh berikut memberi peringkat artikel berdasarkan kesamaan dan menetapkan kuartil.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'neural networks' USE MODEL Ada2Embeddings);

SELECT 
    id,
    title,
    category,
    distance,
    ROW_NUMBER() OVER (ORDER BY distance) AS rank,
    NTILE(4) OVER (ORDER BY distance) AS quartile
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
WHERE distance < 0.5
ORDER BY rank;

Mengatur operasi (UNION, INTERSECT, EXCEPT)

Contoh berikut menggabungkan hasil dari dua kueri pencarian yang berbeda menggunakan UNION.

DECLARE @qv1 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'artificial intelligence' USE MODEL Ada2Embeddings);
DECLARE @qv2 VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'machine learning' USE MODEL Ada2Embeddings);

SELECT id, title, 'AI Search' AS source
FROM (
    SELECT TOP (50) WITH APPROXIMATE
        t.id,
        t.title,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv1,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS ai_results

UNION

SELECT id, title, 'ML Search' AS source
FROM (
    SELECT TOP (50) WITH APPROXIMATE
        t.id,
        t.title,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv2,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS ml_results
ORDER BY id;

NYATA

Contoh berikut mendapatkan kategori yang berbeda dari artikel pencocokan teratas.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'deep learning' USE MODEL Ada2Embeddings);

SELECT DISTINCT category
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
WHERE distance < 0.7
ORDER BY category;

Beberapa kolom ORDER BY

Contoh berikut mengurutkan menurut jarak, lalu menurut judul untuk ikatan.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'quantum computing' USE MODEL Ada2Embeddings);

SELECT 
    id,
    title,
    category,
    distance
FROM (
    SELECT TOP (100) WITH APPROXIMATE
        t.id,
        t.title,
        t.category,
        r.distance
    FROM VECTOR_SEARCH(
        TABLE = dbo.wikipedia_articles AS t,
        COLUMN = title_vector,
        SIMILAR_TO = @qv,
        METRIC = 'cosine'
    ) AS r
    ORDER BY r.distance
) AS vector_results
ORDER BY distance, title;

TERAPKAN SILANG

Saat menggunakan SELECT TOP (N) WITH APPROXIMATE dengan VECTOR_SEARCH, Anda tidak dapat menggunakan CROSS APPLY atau OUTER APPLY dalam klausa yang sama FROM . Ini berlaku bahkan jika tidak ada referensi luar dalam VECTOR_SEARCH fungsi.

Kueri dengan CROSS APPLY akan secara logis melakukan beberapa pencarian vektor (satu per baris dari tabel luar) dan menggabungkan semua hasil ke dalam satu aliran yang diurutkan. Perkiraan algoritma tetangga terdekat tidak dapat menggabungkan hasil secara efisien dari beberapa pencarian vektor independen sambil mempertahankan perkiraan jaminan dan karakteristik performa.

Pola yang menghasilkan kesalahan:

-- This query is NOT supported
SELECT TOP (100) WITH APPROXIMATE
    o.id,
    vs.title,
    vs.distance
FROM Orders AS o
    CROSS APPLY VECTOR_SEARCH(
        TABLE = Products,
        COLUMN = embedding,
        SIMILAR_TO = o.customer_preference_vector,
        METRIC = 'cosine'
    ) AS vs
WHERE o.order_date > '2026-01-01'
ORDER BY vs.distance;

Pola ini mencoba menemukan produk serupa untuk preferensi pelanggan setiap pesanan, tetapi tidak dapat dijalankan dengan perkiraan rencana pencarian vektor.

Pola yang direkomendasikan:

Untuk mencapai hasil yang sama, gunakan subkueri dengan TOP (N) WITH APPROXIMATE dalam dirinya CROSS APPLY sendiri:

-- This query IS supported
SELECT
    o.id,
    vs.title,
    vs.distance
FROM Orders AS o
    CROSS APPLY (
        SELECT TOP (10) WITH APPROXIMATE
            p.title,
            r.distance
        FROM VECTOR_SEARCH(
            TABLE = Products AS p,
            COLUMN = embedding,
            SIMILAR_TO = o.customer_preference_vector,
            METRIC = 'cosine'
        ) AS r
        ORDER BY r.distance
    ) AS vs
WHERE o.order_date > '2026-01-01';

Dalam pola ini:

  • Setiap pencarian vektor dibatasi hingga 10 hasil teratas dalam subkueri
  • Kueri luar tidak menggunakan WITH APPROXIMATE
  • Hasil dilingkup dengan benar per baris dari tabel luar

Operasi yang bekerja secara langsung

Operasi berikut dapat digunakan langsung tanpa VECTOR_SEARCH memerlukan subkueri: