Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2025 (17.x)
Database SQL Azure SQL database
di 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
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
TABLEargumen.Kolom tambahan bernama
distance, yang mewakili jarak antara vektor dalam kolom yang ditentukan olehCOLUMNargumen dan vektor yang disediakan dalamSIMILAR_TOargumen.
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
distanceharus 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
A. Pencarian kesamaan vektor dasar
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:
- Mengaktifkan fitur pratinjau (diperlukan untuk SQL Server 2025 saja; tidak diperlukan untuk Azure SQL Database atau database SQL di Fabric).
- Buat tabel
dbo.Articlessampel dengan kolomembeddingdengan vektor tipe data(5). - Sisipkan 100 baris data sampel dengan data penyematan tiruan.
- Buat indeks vektor pada
dbo.Articles.embedding. - Menunjukkan pencarian kesamaan vektor dengan
VECTOR_SEARCHfungsi .
-- 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
edariTABLE = wikipedia_articles_embeddings AS etersedia 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:
-
TOP_NMenghapus parameter dariVECTOR_SEARCHfungsi - Gunakan
SELECT TOP (N) WITH APPROXIMATEsintaks 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
TOP DENGAN PERKIRAAN tanpa VECTOR_SEARCH
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:
- Menghilangkan indeks vektor
- Memotong tabel
- Mengisi ulang tabel dengan setidaknya 100 baris
- 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');
Petunjuk tabel untuk pencarian vektor
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 APPROXIMATEdalam 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:
- INNER JOIN - Lihat Contoh D: Gabungan multi-tabel dengan INNER JOIN
- Predikat WHERE - Menerapkan iteratif atau pasca-pemfilteran
- Jarak ORDER BY tunggal