CREATE VECTOR INDEX (Transact-SQL)

Uygulandığı yer: SQL Server 2025 (17.x) Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

En yakın komşu aramalarının performansını artırmak için bir vektör sütununda yaklaşık bir indeks oluşturun. Vektör indeksleme ve vektör aramasının nasıl çalıştığı ve kesin ile yaklaşık arama arasındaki farklar hakkında daha fazla bilgi edinmek için SQL Database Engine'deki Vektör arama ve vektör indekslerine bakınız.

Özellik kullanılabilirliği

  • Vektör indeksi ve VECTOR_SEARCH Azure SQL Veritabanı'de genel olarak erişilebilir (GA), Microsoft Fabric'de SQL veritabanı ve Azure SQL Yönetilen Örneği her zamanup-totarihgüncelleme politikasıyla mevcuttur.
  • Vector index ve VECTOR_SEARCH SQL Server 2025 (17.x) ve Azure SQL Yönetilen Örneği'da SQL Server 2025 güncelleme politikasıyla önizleme özellikleridir.

Uyarı

Kullanımdan çıkarma bildirimi: Daha önceki bir veri yapısı kullanılarak oluşturulan vektör indeksleri mevcut sürümde desteklenmekte olmakla birlikte, gelecekteki bir sürümde emekliye kaldırılacaktır. Gelecekteki uyumluluk ve en son vektör arama yeteneklerine erişim sağlamak için, mevcut vektör indekslerini Önceki vektör indeks sürümlerinden geçiş bölümündeki adımları kullanarak taşıyın.

SQL Server 2025 önizleme özelliği

SQL Server 2025 ve Azure SQL Yönetilen Örneği'ta SQL Server 2025güncelleme politikasında, vektör indeksleri ve VECTOR_SEARCH fonksiyon önizleme aşamasındadır ve değişebilir. Bu özelliği kullanmak için veritabanı kapsamlı yapılandırmayı etkinleştirmeniz PREVIEW_FEATURES gerekir.

Kullanmadan önce mevcut sınırlamaları kontrol edin.

Uyarı

Vektör indekslerinin en son sürümü Azure SQL Veritabanı'de, SQL veritabanı Microsoft Fabric'de ve Azure SQL Yönetilen Örneği up-to tarih güncelleme politikasıyla mevcuttur.

Sözdizimi

Transact-SQL söz dizimi kuralları

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

Tartışmalar

index_name

Dizinin adı. Dizin adlarının bir tablo içinde benzersiz olması gerekir, ancak veritabanında benzersiz olması gerekmez. Dizin adları tanımlayıcıların kurallarına uymalıdır.

nesne

Dizinin oluşturulduğu tablo. Temel tablo olmalıdır. Hem yerel hem de genel görünümler, geçici tablolar desteklenmez.

vector_column

Vektör dizinini oluşturmak için kullanılacak sütun. Vektör türünde olmalıdır.

METRİK

Verilen iki vektör arasındaki uzaklığı hesaplamak için kullanılacak uzaklık ölçümünün adını içeren bir dize. Aşağıdaki uzaklık ölçümleri desteklenir:

  • cosine - Kosinüs uzaklığı
  • euclidean - Öklid uzaklığı
  • dot - (Negatif) Noktalı ürün

TYPE

Dizini oluşturmak için kullanılan ANN algoritmasının türü. Şu anda yalnızca DiskANN desteklenmektedir. DiskANN varsayılan değerdir.

MAXDOP

Dizin işlemi için en yüksek paralellik derecesi yapılandırma seçeneğini geçersiz kılar. Daha fazla bilgi için bkz. Sunucu yapılandırması: en yüksek paralellik derecesi. Bir dizin derleme işlemi için paralellik derecesini ve sonuçta elde edilen kaynak tüketimini sınırlamak için kullanın MAXDOP .

max_degree_of_parallelism olabilir:

  • 1

    Paralel plan oluşturmayı bastırır.

  • >1

    Paralel dizin işleminde kullanılan en yüksek paralellik derecesini, geçerli sistem iş yüküne göre belirtilen sayıyla veya daha az değerle kısıtlar.

  • 0 (varsayılan)

    Geçerli sistem iş yüküne göre azaltılmadığı sürece sunucu, veritabanı veya iş yükü grubu düzeyinde belirtilen paralellik derecesini kullanır.

    Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma.

    Paralel dizin işlemleri SQL Server'ın her sürümünde kullanılamaz. SQL Server'daki sürümler tarafından desteklenen özelliklerin listesi için bkz. SQL Server 2025'in Sürümleri ve desteklenen özellikleri.

Vektör dizinlerini en son sürüme yükseltme

Önemli

Kullanımdan çıkarma bildirimi: Mevcut sürüm, önceki veri yapısı kullanılarak oluşturulan vektör indekslerini destekler, ancak gelecekteki sürümde bu destek kaldırılacaktır. Gelecekteki uyumluluk ve en son vektör arama yeteneklerine erişim sağlamak için, mevcut vektör indekslerini aşağıdaki adımlarla taşın.

Yeni oluşturulan vektör dizinleri otomatik olarak en son veri yapısını kullanır ve bu da şunları sağlar:

  • Tam DML desteği: Dizin oluşturulduktan sonra vektör dizinli tabloları salt okunur yapan önceki sınırlamayı kaldırır. Artık INSERT, UPDATE, DELETE, ve MERGE işlemleri gerçekleştirerek vektör indeksi işlevselliğini otomatik ve gerçek zamanlı indeks bakımıyla koruyabilirsiniz.
  • Yinelemeli filtreleme: Vektör arama sürecinde cümledeki önlemleri WHERE uygular, başvurudan sonra değil.
  • Optimizer odaklı: Sorgu optimizleyicisi, sorgu özelliklerine göre DiskANN indeksi veya kNN araması kullanılıp kullanılmayacağına otomatik olarak karar verir.
  • İleri kuantizasyon: Daha iyi depolama verimliliği ve daha hızlı sorgu performansı sağlamak için vektör kuantizasyon tekniklerini entegre eder. Bu optimizasyonlar kullanıcılar için şeffaftır.

Önceki vektör indeks sürüm sınırlamaları hakkında detaylar için Sınırlamalar ve Dikkate Alınanlar bölümüne bakınız.

Önceki vektör dizini sürümlerinden geçiş

En son yetenekleri etkinleştirmek için, önceki bir versiyonu kullanan vektör indekslerini bırakıp yeniden oluşturmalısınız. Bu bölümde vektör dizini sürümlerini tanımlama, geçirme ve doğrulama açıklanmaktadır.

1. Adım: Mevcut vektör dizinlerini tanımlama

Geçiş gerektiren vektör dizinlerini tanımlamak için aşağıdaki sorguyu kullanın:

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;
Sonuçları yorumlama

En son sürümü kullanır

  • Zaten yinelemeli filtreleme, tam DML desteği, optimizer odaklı yürütme ve geliştirilmiş kuantizasyonu destekliyor.
  • Geçiş gerekmez.

Önceki bir sürüm kullanılarak oluşturuldu

  • Eski filtre sonrası davranışı kullanıyor.
  • En son vektör arama yeteneklerini desteklemiyor.
  • Gelecekteki uyumluluk için göç kesinlikle tavsiye edilir.

2. Adım: Vektör dizinini bırakma ve yeniden oluşturma

Daha önceki bir format kullanan vektör indekslerini yükseltemezsiniz. En son DiskANN özelliklerini etkinleştirmek için dizini bırakın ve yeniden oluşturun.

Uyarı

Hizmet etkisi: Vektör dizininin bırakılması, dizin yeniden oluşturulana kadar etkilenen tabloda yaklaşık vektör aramasını hemen devre dışı bırakır. Üretim sistemleri için bakım pencereleri sırasında geçişleri planlayın.

Mevcut dizini bırakma
DROP INDEX vec_idx ON dbo.wikipedia_articles;
Dizini yeniden oluşturma
CREATE VECTOR INDEX vec_idx
    ON dbo.wikipedia_articles (title_vector)
    WITH (
        TYPE = 'DISKANN',
        METRIC = 'COSINE'
    );

Uyarı

Mevcut CREATE VECTOR INDEX ifadeyle oluşturulan vektör indeksleri otomatik olarak en son DiskANN formatını kullanır. Ek seçenek veya bayrak gerekmez.

3. Adım: Dizin sürümünü doğrulama

İndeks yeniden oluşturduktan sonra, en son sürümü kullandığından emin olun:

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

Sütunun index_version en son sürüm için görüntülenmesi 3 gerekir.

Sürüm uyumsuzluğuyla ilgili hata davranışı

parametresini TOP_NVECTOR_SEARCH en son sürüm vektör diziniyle kullanmaya çalışırsanız, SQL Server aşağıdaki hatayı döndürür:

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

Bu hatayı çözmek için parametresini TOP_NVECTOR_SEARCH kaldırın ve bunun yerine söz dizimini SELECT TOP (N) WITH APPROXIMATE kullanın. Ayrıntılı bilgi için bkz. Eski söz dizimi kullanılırken hata oluştu.

Sınırlamalar ve Dikkat Edilecek Hususlar

Önceki vektör dizini sürüm sınırlamaları

Önceki vektör indeks versiyonlarının aşağıdaki sınırlamaları vardır. Dizin sürümünüzü denetlemek için bkz. Dizin sürümünü doğrulama.

  • Sadece filtreleme sonrası seçim: Önlemler yalnızca vektör başvurusundan sonra uygulanır, arama sürecinde değil. Bu davranış, filtre uyguladığınızda beklenenden daha az satır geri dönmesine yol açabilir.

  • Salt okunur tablolar: Vektör dizinleri olan tablolar salt okunur durumdadır. Vektör indeksi oluşturulduktan sonra DML işlemlerini (INSERT, UPDATE, DELETE, MERGE, ) gerçekleştiremezsiniz. ALLOW_STALE_VECTOR_INDEX Eski arama sonuçlarını tolere edebilirseniz DML işlemlerini etkinleştirmek için veritabanı kapsamlı yapılandırmasını kullanın.

  • Manuel TOP_N ayarlama: Filtreleme sonrası parametreyi VECTOR_SEARCH elle ayarlamanız TOP_N gerekir. İstenilen sayıda sonucu almak için genellikle büyük değerlere ihtiyacınız olur.

Geçerli sınırlamalar (en son sürüm için de geçerlidir)

Geçerli önizlemede aşağıdaki sınırlamalar vardır:

  • Vektör indekslerini bölmek mümkün değil.

  • Tablo, bir ökreleme sütununda birincil anahtar kümelenmiş bir indekse sahip olmalıdır.

  • Vektör dizinleri abonelere çoğaltılamaz.

  • Vektör indeksli tabloları kısamazsınız.TRUNCATE TABLE Tüm verileri kaldırmak için, önce vektör dizinini bırakın, tabloyu kırpın, en az 100 satırla yeniden doldurularak dizini yeniden oluşturun. Daha fazla bilgi için kısıtlamalara bakınızTRUNCATE TABLE.

  • Vektör indeksleri DacPac ile dağıtılamaz. DacFx sürüm 170.5.96 ile başlayan BACPAC ile vektör indeksleri içeren veritabanları dağıtabilirsiniz. Vektör indeksleri, tablo verileri yüklendikten sonra oluşturulur ve indekslenen tabloda en az 100 satır vektör olmayanNULL değerler içermelidir.

    Yalnızca şema tabanlı DACPAC dağıtımı sırasında, hedef tabloda vektör olmayan değerlere sahip 100 satırdanNULL az varsa, vektör indeksi oluşturmadan dağıtım başarılı olabilir. DacFx, satırlar daha sonra eklendiğinde otomatik olarak atlanan indeks oluşturmaz. En az 100 nitelikli satır yüklendikten sonra, vektör indeksini dağıtım sonrası bir betik kullanarak oluşturun, DACPAC'ı tekrar yayınlayın veya çalıştırın CREATE VECTOR INDEX.

    Bir içe aktarma veya dağıtımdan sonra, vektör indeksinin oluşturulduğunu sorgulayarak sys.vector_indexesdoğrulayın.

    DacFx sürüm 170.5.96'dan önce bir çözüm olarak, veritabanını dışa aktarmadan önce vektör indekslerini bırakın ve içe aktardıktan sonra indeksleri yeniden oluşturun.

En düşük veri gereksinimleri

Vektör indeksleri, indeks oluşturmak için vektör olmayanNULL değerlere sahip minimum satır sayısı gerektirir.

  • Minimum satır sayısı: Tabloda en az 100 satır ve vektör olmayanNULL değerler bulunmalıdır.
  • Hata davranışı: 100 satırdan az olan bir tabloda vektör indeksi oluşturmaya çalışırsanız, işlem başarısız olur ve Msg 42266 hatası döner.

Örnek hatası:

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.

En iyi yöntem: Vektör dizinini oluşturmadan önce tabloyu en az 100 satırla doldurun. Daha az satır gerektiren geliştirme ve test senaryoları için, VECTOR_SEARCH brute-force tarama yöntemiyle indeks olmadan çalışır. Ancak, bu yöntem daha büyük veri setlerinde performansı düşürür.

DML desteği

En son sürümü kullanarak bir DiskANN vektör indeksi oluşturduğunuzda, tablo artık sadece okunabilir değildir. Standart veri işleme dili (DML) işlemlerini kullanarak veriyi değiştirebilirsiniz ve değişiklikler vektör arama sonuçlarında otomatik olarak görünür.

Bu özellik, vektör aramasını verilerin zaman içinde değiştiği canlı, işlemsel iş yükleri için uygun hale getirir.

Davranış notları

  • DML işlemleri vektör dizininin bırakılıp yeniden oluşturulmasını gerektirmez.
  • Değişiklikler, işlem işlemelerinden sonra vektör arama sorgularında görünür.
  • Büyük ölçekli veri değişimi için (örneğin, çoğu satırı silme ve tamamen yeni bir ekleme kümesi ekleme), en iyi arama kalitesini sağlamak için veri yükünden sonra vektör dizinini bırakıp yeniden oluşturmayı göz önünde bulundurun.

Uyarı

DML desteği yalnızca en son sürüm kullanılarak oluşturulan vektör indeksleriyle mevcuttur. Önceki sürümler tabloların salt okunur olmasını veya veritabanı kapsamlı yapılandırmasını kullanmasını ALLOW_STALE_VECTOR_INDEX gerektirir.

İzleme vektör dizini bakımı

Vektör dizinleri, DML değişikliklerini birleştirmek için arka plan bakımı gerçekleştirir. Dizin durumunu ve bakım görevi durumunu izlemek için sys.dm_db_vector_indexes dinamik yönetim görünümünü kullanın.

Vektör dizinlerini geleneksel dizinlerle birleştirme

Vektör dizinleri, en iyi sorgu performansını sağlamak için geleneksel B ağacı dizinleri ile birlikte çalışır. ile VECTOR_SEARCHyinelemeli filtreleme kullanırken, filtre koşullarında kullanılan sütunlarda geleneksel dizinler oluşturmayı göz önünde bulundurun.

Yinelemeli filtreleme davranışı ve önceki sürümlerden farkı hakkında ayrıntılı bilgi için bkz. Yinelemeli filtreleme davranışı.

Tip

Sorgu iyileştirici otomatik olarak en iyi yürütme stratejisini seçer (yaklaşık en yakın komşu dizini ve kNN araması). Yaklaşık en yakın komşu dizininin kullanılmasını zorlamak için tablo ipucunu FORCE_ANN_ONLY kullanın. Daha fazla bilgi için bkz. Vektör araması için tablo ipuçları.

Örnek senaryo:

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

Performans avantajı:

Yinelemeli filtreleme ile sorgu yürütürken, SQL Server sorgu iyileştiricisi her iki dizin türünü de kullanır:

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;

Bu sorguda:

  • Vektör dizini, sorgu vektöre göre benzer eklemeleri tanımlar
  • Yinelemeli arama işlemi sırasında adayları verimli bir şekilde filtrelediğinde geleneksel dizin(category)

Bu bileşik strateji, özellikle filtre koşullarının yüksek seçiciliğe sahip olması halinde yalnızca vektör dizini kullanımına kıyasla sorgu performansını önemli ölçüde iyileştirebilir.

Vektör dizinleri için veri kalitesi ve bakım kılavuzu

Yüksek yinelenen eklemelere sahip veri kümelerinden kaçının

Vektör dizin oluşturma, eklemeler çeşitli anlamsal içeriği temsil ederken en iyi şekilde çalışır. Vektör indeksleme için yüksek oranda tekrarlanan vektör içeren veri setlerini kullanmayın.

Yüksek yineleme şu nedenlere yol açabilir:

  • Düşük sonuç kalitesi: Yinelenen vektörler sonuçlarda art arda görünür ve daha ilgili anlamsal eşleşmeler elde eder.
  • Daha az etkinlik: Yinelenen eklemeler daha iyi komşuları yerlerinden ederek benzerlik aramasının kullanışlılığını azaltır.
  • Gereksiz kaynak kullanımı: Vektör dizinlerinin oluşturulması ve bakımı pahalıdır ve yinelenenler değer eklemeden maliyet ekler.

En iyi yöntem: Hem performansı hem de sonuç kalitesini artırmak için vektör dizini oluşturmadan önce eklemeleri yinelenenleri kaldırma.

Büyük ölçekli veri değiştirme senaryoları

Vektör dizinleri eklemeleri, güncelleştirmeleri ve silmeleri destekler. Ancak, çoğu veya tüm gömmeleri değiştirdiğinizde—örneğin, bir veri setini yeni bir modelle yeniden gömmek—mevcut endeks artık yeni veri dağılımını yansıtmayabilir.

Büyük ölçekli değiştirme senaryolarında:

  • Vektör arama sorguları geçerli sonuçlar vermeye devam ediyor.
  • Geri çağırma ve sıralama kalitesi düşebilir, çünkü endeks yapısı farklı bir gömüleme dağılımı için oluşturulmuştur.

En iyi yöntem: Neredeyse eksiksiz veri değiştirme işlemi gerçekleştirirken (yeni eklemeleri silin ve ekleyin), yeni verileri yükledikten sonra vektör dizinini bırakın ve yeniden oluşturun. Dizini yeniden oluşturmak, yeni ekleme dağıtımı için iyileştirilmesini sağlar ve tahmin edilebilir sorgu davranışını geri yükler.

Bilinen sorunlar

Daha fazla bilgi için Bkz. Bilinen sorunlar.

İzinler

Masada izin alman lazım ALTER .

Örnekler

Vektör ekleme örneğiyle Wikipedia makalesini indirin ve içeri aktarın.

Bu örnekler, Wikipedia makalelerinin başlık gömülmelerini saklayan bir tür vector sütunlu title_vector bir tablo varsayılırwikipedia_articles. Metin-gömme-ada-002title_vector veya metin-gömme-3-small gibi bir göme modeli kullanır ve 1.536 boyutlu vektörler döndürür.

Daha fazla örnek için, uçtan uca çözümler de dahil olmak üzere, Azure SQL Veritabanı Vector Search Samples GitHub reposuna bakınız.

Örnek 1

Aşağıdaki örnek, ölçümü kullanarak title_vector sütunda cosine bir vektör dizini oluşturur.

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

Örnek 2

Aşağıdaki örnek, (negatif) dot çarpım metriğiyle sütun üzerinde title_vector bir vektör indeksi oluşturur. Paralelliği 8 ile sınırlar ve vektörü SECONDARY dosya grubunda saklar.

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

Örnek 3

Bu örnek ve ilgili VECTOR_SEARCH fonksiyon kullanılırCREATE VECTOR INDEX. Eklemeler sahtedir. Gerçek bir senaryoda, gömülü modeli ve AI_GENERATE_EMBEDDINGS kullanarak gömülemeler oluşturun veya OpenAI SDK gibi harici bir kütüphane kullanın.

Uyarı

En son versiyon vektör indeksleri için indeks oluşturulabilmek için en az 100 satır veri gerekir. Bu örnek, bu gereksinimi karşılamak için 100 satır ekler. Daha fazla bilgi için bkz. En düşük veri gereksinimleri.

Aşağıdaki kod bloğu sahte eklemelerle gösterilmiştir CREATE VECTOR INDEX :

  1. Önizleme özelliğini etkinleştirin (sadece SQL Server 2025 için gereklidir; Azure SQL Veritabanı veya Fabric'taki SQL veritabanı için gerekli değildir).
  2. Veri türü dbo.Articles içeren bir sütun embedding içeren örnek tablo oluşturun.
  3. Sahte ekleme verileriyle 100 satır örnek veri ekleyin.
  4. üzerinde dbo.Articles.embeddingbir vektör dizini oluşturun.
  5. İşlevle vektör benzerliği aramasını VECTOR_SEARCH gösterin.
-- 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;

Sorgulama söz dizimi vektör dizini sürümüne bağlıdır:

Vektör dizini sürümü Söz dizimi örneği
En son sürüm Parametresiz SELECT TOP (N) WITH APPROXIMATE kullanma TOP_N
Önceki sürümler (kullanım dışı) İşlevde TOP_N parametre kullanma VECTOR_SEARCH

Önceki sürüm dizinleri için (kullanım dışı söz dizimi):

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;

Örnek 4: DML işlemleriyle çalışma

Aşağıdaki örnekler, en son versiyon kullanılarak oluşturulan vektör indeksine sahip bir tablo üzerindeki DML işlemlerini göstermektedir.

Satırları silme

Satırların silinmesi, bunları hem tablodan hem de vektör arama sonuçlarından kaldırır.

DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;

Silme işlemi tamamlandıktan sonra, kaldırılan satır vektör arama sorgularında görünmez.

Yeni satır ekleme

Eklemelerle yeni satırlar ekleyebilirsiniz ve bunlar dizini yeniden oluşturmadan hemen aranabilir hale gelir.

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

Yeni eklenen eklemeler otomatik olarak vektör dizinine eklenir ve sonraki vektör arama sorguları tarafından döndürülebilir.

Varolan satırları güncelleştirme

Vektör veya vektör olmayan sütunların güncelleştirilmesi tam olarak desteklenir.

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;

Bir vektör sütununu güncellerseniz, indeks buna göre güncellenir ve gelecekteki vektör aramaları yeni gömülü kullanır.

Karmaşık işlemler için kullanım MERGE

deyimi MERGE , tek bir deyimde ekleme, güncelleştirme ve silme işlemleri gerçekleştirmenizi sağlar.

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;

Vektör indeksi, ifadede MERGE yapılan tüm değişiklikleri yansıtacak şekilde otomatik olarak güncellenir.