Bagikan melalui


Jenis Data Vektor

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

Jenis data vektor dirancang untuk menyimpan data vektor yang dioptimalkan untuk operasi seperti pencarian kesamaan dan aplikasi pembelajaran mesin. Vektor disimpan dalam format biner yang dioptimalkan tetapi diekspos sebagai array JSON untuk kenyamanan. Setiap elemen vektor disimpan sebagai nilai floating-point presisi tunggal (4-byte).

Untuk memberikan pengalaman yang familier bagi pengembang, jenis data vektor dibuat dan ditampilkan sebagai array JSON. Misalnya, vektor dengan tiga dimensi dapat direpresentasikan sebagai '[0.1, 2, 30]'. Konversi implisit dan eksplisit dari dan ke jenis vektor dapat dilakukan menggunakan jenis varchar, nvarchar, dan json .

Note

SQL Server 2025 (17.x) mendukung vektor setengah presisi (float16). Untuk informasi selengkapnya, lihat Dukungan float setengah presisi dalam jenis data vektor.

float16 vektor saat ini tersedia untuk pratinjau. Untuk menguji, aktifkan PREVIEW_FEATURES opsi konfigurasi terlingkup database. Untuk detailnya, tinjau PREVIEW_FEATURES = { ON | NONAKTIF }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Untuk batasan, tinjau Batasan dan Masalah yang diketahui.

Note

Fitur vektor tersedia di Azure SQL Managed Instance yang dikonfigurasi dengan kebijakan Always-up-to-date .

Untuk informasi selengkapnya tentang bekerja dengan data vektor, lihat:

Contoh sintaks

Sintaks penggunaan untuk jenis vektor mirip dengan semua jenis data SQL Server lainnya dalam tabel.

column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]

Secara default, jenis dasarnya adalah float32. Untuk menggunakan presisi setengah, Anda perlu menentukan float16 secara eksplisit.

column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]

Dimensions

Vektor harus memiliki setidaknya satu dimensi. Jumlah maksimum dimensi yang didukung adalah 1998.

Examples

A. Definisi kolom

Dalam pernyataan CREATE TABLE, jenis vektor dapat digunakan dalam definisi kolom, misalnya:

Contoh berikut membuat tabel dengan kolom vektor dan menyisipkan data ke dalamnya.

Anda dapat menentukan kolom vektor dalam tabel menggunakan jenis dasar default (float32) atau secara eksplisit menentukan float16 untuk penyimpanan setengah presisi.

CREATE TABLE dbo.vectors
(
    id INT PRIMARY KEY,
    v VECTOR(3) NOT NULL -- Uses default base type (`float32`)
);

CREATE TABLE dbo.vectors_fp16
(
    id INT PRIMARY KEY,
    v VECTOR(3, float16) -- Uses float16 for reduced storage and precision
);

INSERT INTO dbo.vectors (id, v)
VALUES (1, '[0.1, 2, 30]'),
       (2, '[-100.2, 0.123, 9.876]'),
       (3, JSON_ARRAY(1.0, 2.0, 3.0)); -- Using JSON_ARRAY to create a vector

SELECT *
FROM dbo.vectors;

B. Penggunaan dalam variabel

Contoh berikut mendeklarasikan vektor menggunakan jenis data vektor baru dan menghitung jarak menggunakan VECTOR_DISTANCE fungsi .

Jenis vektor dapat digunakan dengan variabel:

DECLARE @v AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
GO
DECLARE @v AS VECTOR(3, float16) = '[0.1, 2, 30]';
SELECT @v;

C. Penggunaan dalam prosedur atau fungsi tersimpan

Jenis data vektor dapat digunakan sebagai parameter dalam prosedur atau fungsi tersimpan. Contohnya:

CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
    SELECT @V;
    SET @V2 = @V;
END

Ketersediaan fitur

Jenis vektor baru tersedia di bawah semua tingkat kompatibilitas database.

Dukungan untuk fitur float16 saat ini dibatasi di bawah konfigurasi PREVIEW_FEATURES. Anda harus mengaktifkannya secara eksplisit sebelum menggunakan VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • Jenis vektor tidak dapat digunakan dengan jenis sql_variant atau ditetapkan ke variabel atau kolom sql_variant . Pembatasan ini mirip dengan varchar(max), varbinary(max), nvarchar(max), xml, json, dan jenis data berbasis CLR.

Compatibility

Penyempurnaan protokol TDS

SQL Server menyimpan vektor dalam format biner yang dioptimalkan tetapi mengeksposnya sebagai array JSON untuk kenyamanan.

Driver yang didukung menggunakan penyempurnaan pada protokol TDS untuk mengirimkan data vektor secara lebih efisien dalam format biner dan menyajikannya ke aplikasi sebagai jenis vektor asli. Pendekatan ini mengurangi ukuran payload, menghilangkan overhead penguraian format JSON, dan mempertahankan presisi titik mengambang penuh. Akibatnya, ia meningkatkan performa dan akurasi saat bekerja dengan vektor dimensi tinggi dalam AI dan skenario pembelajaran mesin.

Note

float16 vektor saat ini ditransmisikan sebagai varchar(max) (array JSON) melalui TDS. Dukungan transportasi biner untuk float16 belum tersedia di driver seperti ODBC, JDBC, dan .NET.

Dukungan Driver Asli

Aplikasi yang menggunakan TDS versi 7.4 atau lebih tinggi dan driver yang diperbarui dapat membaca, menulis, mengalirkan, dan menyalin data vektor secara massal secara asli.

Kemampuan ini memerlukan versi driver berikut. Pastikan Anda menggunakan versi yang benar untuk mengaktifkan dukungan vektor asli.

  • Microsoft.Data.SqlClient: Versi 6.1.0 memperkenalkan tipe baru, SqlVector, yang memperluas System.Data.SqlDbTypes.
  • Microsoft JDBC Driver untuk SQL Server: Versi 13.1.0 Pratinjau memperkenalkan microsoft.sql.Types.VECTOR tipe dan microsoft.sql.Vector kelas.

Note

Untuk klien yang tidak mendukung protokol TDS yang diperbarui, SQL Server terus mengekspos data vektor sebagai jenis varchar(max) untuk memastikan kompatibilitas mundur. Aplikasi klien dapat bekerja dengan data vektor seolah-olah itu adalah array JSON. SQL Database Engine secara otomatis mengonversi vektor ke dan dari array JSON, membuat jenis baru transparan untuk klien. Oleh karena itu driver dan semua bahasa secara otomatis kompatibel dengan jenis baru.

Anda dapat segera mulai menggunakan jenis vektor baru. Contoh berikut menunjukkan berbagai bahasa dan konfigurasi driver.

Important

Memerlukan Microsoft.Data.SqlClient 6.1.0 atau yang lebih baru untuk dukungan vektor asli.

using Microsoft.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlTypes;

namespace VectorSampleApp
{
    class Program
    {
        // Set your environment variable or fallback to local server
        private static readonly string connectionString =
            Environment.GetEnvironmentVariable("CONNECTION_STR")
            ?? "Server=tcp:localhost,1433;Database=Demo2;Integrated Security=True;TrustServerCertificate=True";

        private const int VectorDimensions = 3;
        private const string TableName = "dbo.Vectors";

        static void Main()
        {
            using var connection = new SqlConnection(connectionString);
            connection.Open();
            SetupTables(connection, TableName, VectorDimensions);
            InsertVectorData(connection, TableName);
            ReadVectorData(connection, TableName);
        }

        private static void SetupTables(SqlConnection connection, string tableName, int vectorDimensionCount)
        {
            using var command = connection.CreateCommand();

            command.CommandText = $@"
                IF OBJECT_ID('{tableName}', 'U') IS NOT NULL DROP TABLE {tableName};
                IF OBJECT_ID('{tableName}Copy', 'U') IS NOT NULL DROP TABLE {tableName}Copy;";
            command.ExecuteNonQuery();

            command.CommandText = $@"
                CREATE TABLE {tableName} (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );

                CREATE TABLE {tableName}Copy (
                    Id INT IDENTITY(1,1) PRIMARY KEY,
                    VectorData VECTOR({vectorDimensionCount})
                );";
            command.ExecuteNonQuery();
        }

        private static void InsertVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"INSERT INTO {tableName} (VectorData) VALUES (@VectorData)", connection);
            var param = command.Parameters.Add("@VectorData", SqlDbTypeExtensions.Vector);

            // Insert null using DBNull.Value
            param.Value = DBNull.Value;
            command.ExecuteNonQuery();

            // Insert non-null vector
            param.Value = new SqlVector<float>(new float[] { 3.14159f, 1.61803f, 1.41421f });
            command.ExecuteNonQuery();

            // Insert typed null vector
            param.Value = SqlVector<float>.CreateNull(VectorDimensions);
            command.ExecuteNonQuery();

            // Prepare once and reuse for loop
            command.Prepare();
            for (int i = 0; i < 10; i++)
            {
                param.Value = new SqlVector<float>(new float[]
                {
                    i + 0.1f,
                    i + 0.2f,
                    i + 0.3f
                });
                command.ExecuteNonQuery();
            }
        }

        private static void ReadVectorData(SqlConnection connection, string tableName)
        {
            using var command = new SqlCommand($"SELECT VectorData FROM {tableName}", connection);
            using var reader = command.ExecuteReader();

            while (reader.Read())
            {
                var sqlVector = reader.GetSqlVector<float>(0);

                Console.WriteLine($"Type: {sqlVector.GetType()}, IsNull: {sqlVector.IsNull}, Length: {sqlVector.Length}");

                if (!sqlVector.IsNull)
                {
                    float[] values = sqlVector.Memory.ToArray();
                    Console.WriteLine("VectorData: " + string.Join(", ", values));
                }
                else
                {
                    Console.WriteLine("VectorData: NULL");
                }
            }
        }
    }
}

Note

Jika Anda tidak menggunakan driver .NET terbaru, Anda masih dapat bekerja dengan data vektor di C# dengan menserialisasikan dan mendeserialisasinya sebagai string JSON menggunakan JsonSerializer kelas . Ini memastikan kompatibilitas dengan varchar(max) representasi vektor yang diekspos oleh SQL Server untuk klien yang lebih lama.

using Microsoft.Data.SqlClient;
using Dapper;
using DotNetEnv;
using System.Text.Json;

namespace DotNetSqlClient;

class Program
{
    static void Main(string[] args)
    {
        Env.Load();

        var v1 = new float[] { 1.0f, 2.0f, 3.0f };

        using var conn = new SqlConnection(Env.GetString("MSSQL"));
        conn.Execute("INSERT INTO dbo.vectors VALUES(100, @v)", param: new {@v = JsonSerializer.Serialize(v1)});

        var r = conn.ExecuteScalar<string>("SELECT v FROM dbo.vectors") ?? "[]";
        var v2 = JsonSerializer.Deserialize<float[]>(r);
        Console.WriteLine(JsonSerializer.Serialize(v2));
    }
}

Tools

Alat berikut mendukung jenis data vektor :

Limitations

Jenis vektor memiliki batasan berikut:

Tables

  • Batasan tingkat kolom tidak didukung, kecuali untuk NULL/NOT NULL batasan.

    • DEFAULT dan CHECK batasan tidak didukung untuk kolom vektor .

    • Batasan utama, seperti PRIMARY KEY atau FOREIGN KEY, tidak didukung untuk kolom vektor . Kesetaraan, keunikan, gabungan menggunakan kolom vektor sebagai kunci, dan urutan pengurutan tidak berlaku untuk jenis data vektor .

    • Tidak ada gagasan keunikan untuk vektor, sehingga batasan unik tidak berlaku.

    • Memeriksa rentang nilai dalam vektor juga tidak berlaku.

  • Vektor tidak mendukung perbandingan, penambahan, pengurangan, perkalian, pembagian, perangkaian, atau operator penugasan matematika, logis, dan majemuk lainnya.

  • Kolom vektor tidak dapat digunakan dalam tabel yang dioptimalkan memori.

Indexes

  • Indeks pohon B atau indeks penyimpan kolom tidak diperbolehkan pada kolom vektor . Namun, kolom vektor dapat ditentukan sebagai kolom yang disertakan dalam definisi indeks.

Metadata skema tabel

  • sp_describe_first_result_set prosedur tersimpan sistem tidak mengembalikan jenis data vektor dengan benar. Oleh karena itu, banyak klien akses data dan driver melihat jenis data varchar atau nvarchar.

Tabel buku besar

  • Prosedur sp_verify_database_ledger tersimpan menghasilkan kesalahan jika database berisi tabel dengan kolom vektor .

Jenis yang ditentukan pengguna

  • Pembuatan jenis alias yang digunakan CREATE TYPE untuk jenis vektor tidak diizinkan, mirip dengan perilaku jenis data xml dan json .

Selalu Terenkripsi

  • Jenis vektor tidak didukung dengan fitur Always Encrypted.

Masalah yang diketahui

  • Masking Data saat ini menunjukkan data vektor sebagai jenis data varbinary di portal Microsoft Azure.