Vektoros adattípus

A következőkre vonatkozik: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database a Microsoft Fabricben

A vektoros adattípus olyan műveletekre optimalizált vektoradatok tárolására lett kialakítva, mint a hasonlósági keresés és a gépi tanulási alkalmazások. A vektorok tárolása optimalizált bináris formátumban történik, de JSON-tömbökként vannak elérhetővé téve a kényelem érdekében. A vektor minden eleme egyetlen pontosságú (4 bájtos) lebegőpontos értékként van tárolva.

A fejlesztők számára ismerős élmény érdekében a vektor adattípus JSON-tömbként jön létre és jelenik meg. Egy három dimenzióval rendelkező vektor például a következőképpen jelenhet meg '[0.1, 2, 30]'. Implicit és explicit konverzió a vektor típusból és típusba elvégezhető varchar, nvarchar és json típusok használatával.

Note

Az SQL Server 2025 (17.x) támogatja a fél pontosságú (float16) vektorokat. További információ: Félig pontosságú lebegőpontos támogatás vektoros adattípusban.

float16 a vektor jelenleg előzetes verzióban érhető el. A teszteléshez engedélyezze az PREVIEW_FEATURES adatbázis hatókörébe tartozó konfigurációs beállítást. Részletekért tekintse át PREVIEW_FEATURES = { ON | KI }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

A korlátozásokért tekintse át a korlátozásokat és az ismert problémákat.

Note

A vektorfunkciók az Always-up-to-date szabályzattal konfigurált felügyelt Azure SQL-példányban érhetők el.

A vektoradatokkal kapcsolatos további információkért lásd:

Mintaszintaxis

A vektor típusának használati szintaxisa hasonló a tábla összes többi SQL Server-adattípusához.

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

Alapértelmezés szerint az alaptípus a következő float32: . A félpontosság használatához explicit módon kell megadnia float16 .

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

Dimensions

Egy vektornak legalább egy dimenzióval kell rendelkeznie. A támogatott dimenziók maximális száma 1998.

Examples

A. Oszlopdefiníció

A vektor típus használható egy CREATE TABLE utasítás oszlopdefiníciójában, például:

Az alábbi példa egy vektoroszlopot tartalmazó táblát hoz létre, amelybe adatokat szúr be.

A táblázat vektoroszlopát az alapértelmezett alaptípussal (float32) vagy explicit módon megadhatja float16 a fél pontosságú tároláshoz.

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. Használat változókban

Az alábbi példa vektorokat deklarál az új vektor adattípussal, és kiszámítja a távolságokat a VECTOR_DISTANCE függvénnyel.

A vektor típus változókkal használható:

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. A tárolt eljárásokban vagy függvényekben való használat

A vektor adattípus paraméterként használható a tárolt eljárásban vagy függvényekben. Például:

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

Szolgáltatás rendelkezésre állása

Az új vektor típus minden adatbáziskompatibilitási szinten elérhető.

A float16 vektorok támogatása jelenleg a PREVIEW_FEATURES konfiguráció alatt van. Használata előtt kifejezetten engedélyeznie kell VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • A vektor típus nem használható sql_variant típussal, és nem rendelhető hozzá sql_variant változóhoz vagy oszlophoz. Ez a korlátozás hasonló a varchar(max), varbinary(max), nvarchar(max), xml, json és CLR-alapú adattípusokhoz.

Compatibility

A TDS-protokoll fejlesztései

Az SQL Server optimalizált bináris formátumban tárolja a vektorokat, de A kényelem érdekében JSON-tömbökként teszi elérhetővé őket.

A támogatott illesztőprogramok a TDS protokoll továbbfejlesztései segítségével hatékonyabban továbbítják a vektoradatokat bináris formátumban, és natív vektortípusként jelenítik meg őket az alkalmazásoknak. Ez a megközelítés csökkenti a hasznos adatok méretét, kiküszöböli a JSON-elemzés többletterhelését, és megőrzi a teljes lebegőpontos pontosságot. Ennek eredményeképpen javítja a teljesítményt és a pontosságot, ha nagy dimenziójú vektorokkal dolgozik a mi-ben és a gépi tanulási forgatókönyvekben.

Note

float16 A vektorok jelenleg varchar(max) (JSON-tömb) formátumban vannak továbbítva TDS-en keresztül. A bináris átvitel támogatása float16 még nem érhető el az olyan illesztőprogramokban, mint az ODBC, a JDBC és a .NET.

Natív illesztőprogram-támogatás

A TDS 7.4-es vagy újabb verzióját használó alkalmazások és frissített illesztőprogramok natív módon olvashatják, írhatják, streamelhetik és tömegesen másolhatják a vektoradatokat.

Ezekhez a képességekhez az alábbi illesztőprogramok verziói szükségesek. Győződjön meg arról, hogy a megfelelő verziót használja a natív vektorok támogatásának engedélyezéséhez.

  • Microsoft.Data.SqlClient: A 6.1.0-s verzió bevezeti a típust, és kiterjesztiSqlVector.System.Data.SqlDbTypes
  • Microsoft JDBC-illesztő az SQL Serverhez: A 13.1.0-s verzió előzetes verziója bemutatja a típust és microsoft.sql.Types.VECTOR az microsoft.sql.Vector osztályt.

Note

A frissített TDS protokollt nem támogató ügyfelek esetében az SQL Server továbbra is varchar(max) típusú vektoradatokat tesz elérhetővé a visszamenőleges kompatibilitás biztosítása érdekében. Az ügyfélalkalmazások úgy használhatják a vektoradatokat, mintha JSON-tömb lenne. Az SQL Database Engine automatikusan JSON-tömbökké alakítja át a vektorokat, így az új típus átláthatóvá válik az ügyfél számára. Ezért az illesztőprogramok és az összes nyelv automatikusan kompatibilisek az új típussal.

Az új vektortípust azonnal elkezdheti használni. Az alábbi példák különböző nyelveket és illesztőprogram-konfigurációkat mutatnak be.

Important

A natív vektorok támogatásához a Microsoft.Data.SqlClient 6.1.0-s vagy újabb verziója szükséges.

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

Ha nem a legújabb .NET-illesztőprogramokat használja, akkor is dolgozhat vektoradatokkal A C#-ban, ha az osztály használatával JsonSerializer szerializálja és deszerializálja azokat JSON-sztringként. Ez biztosítja a kompatibilitást az varchar(max) SQL Server által a régebbi ügyfelek számára közzétett vektorok ábrázolásával.

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

A vektor adattípust a következő eszközök támogatják:

Limitations

A vektortípusra a következő korlátozások vonatkoznak:

Tables

  • Az oszlopszintű korlátozások nem támogatottak, kivéve a NULL/NOT NULL korlátozásokat.

    • DEFAULT és CHECK a vektoroszlopok nem támogatják a korlátozásokat.

    • A fő kényszerek, mint például PRIMARY KEY vagy FOREIGN KEY, nem támogatottak a vektoroszlopok esetében. Az egyenlőség, az egyediség, a vektoroszlopokat kulcsként használó illesztések és rendezési sorrendek nem vonatkoznak a vektoros adattípusokra.

    • A vektorok egyediségének fogalma nincs, ezért az egyedi korlátozások nem alkalmazhatók.

    • A vektoron belüli értékek tartományának ellenőrzése szintén nem alkalmazható.

  • A vektorok nem támogatják az összehasonlítást, az összeadást, a kivonást, a szorzást, az osztást, az összefűzést vagy bármely más matematikai, logikai és összetett hozzárendelési operátort.

  • a vektoroszlopok nem használhatók memóriaoptimalizált táblákban.

Indexes

  • B-fa indexek vagy oszlop centrikus indexek nem engedélyezettek vektoros oszlopokon. Egy vektoros oszlop azonban megadható egy indexdefinícióban szereplő oszlopként.

Táblázat séma metaadatai

  • sp_describe_first_result_set rendszer által tárolt eljárás nem adja vissza helyesen a vektort adattípust. Ezért sok adatelérési ügyfél és illesztőprogram lát egy varchar vagy nvarchar adattípust.

Főkönyvtáblák

  • A tárolt eljárás sp_verify_database_ledger hibát okoz, ha az adatbázis egy vektoroszlopot tartalmazó táblát tartalmaz.

Felhasználó által definiált típusok

  • A CREATE TYPE típusú használatával történő aliastípus létrehozása nem engedélyezett, hasonlóan az xml- és json adattípusok viselkedéséhez.

Always Encrypted (mindig titkosítva)

  • az Always Encrypted funkció nem támogatja a vektortípust.

Ismert problémák

  • A Data Masking jelenleg varbináris adattípusként jeleníti meg a vektoradatokat az Azure Portalon.