Sdílet prostřednictvím


Datový typ vektoru

Platí pro: SQL Server 2025 (17.x) Azure SQL Database Azure SQLManaged InstanceSQL Database v Microsoft Fabric

Datový typ vektoru je navržený tak, aby ukládal vektorová data optimalizovaná pro operace, jako je vyhledávání podobnosti a aplikace strojového učení. Vektory jsou uloženy v optimalizovaném binárním formátu, ale jsou zpřístupněny jako pole JSON pro usnadnění. Každý prvek vektoru je uložen jako číslo v plovoucí řádové čárce s jednoduchou přesností (4 bajty).

Pokud chcete vývojářům poskytnout známé prostředí, vytvoří se datový typ vektoru a zobrazí se jako pole JSON. Například vektor se třemi rozměry může být reprezentován jako '[0.1, 2, 30]'. Implicitní a explicitní převod z a na typ vektoru lze provést pomocí varcharu, nvarcharu a typů JSON .

Note

SQL Server 2025 (17.x) podporuje vektory s poloviční přesností (float16). Další informace naleznete v tématu Podpora plovoucí desetinné čárky v datovém typu vektoru s poloviční přesností.

float16 vektor je aktuálně k dispozici pro verzi Preview. Pokud chcete testovat, povolte možnost konfigurace s vymezeným oborem PREVIEW_FEATURES databáze. Podrobnosti najdete v PREVIEW_FEATURES = { ON | VYPNUTO }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Informace o omezeních najdete v tématu Omezení a známé problémy.

Note

Funkce vektorů jsou dostupné ve službě Azure SQL Managed Instance nakonfigurované pomocí zásad [Always-up-to-date](/azure/azure-sql/managed-instance/ update-policy#always-up-to-date-update-policy).

Další informace o práci s vektorovými daty najdete tady:

Ukázková syntaxe

Syntaxe použití pro typ vektoru je podobná všem ostatním datovým typům SQL Serveru v tabulce.

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

Ve výchozím nastavení je float32základní typ . Pokud chcete použít polopřesnost, musíte explicitně zadat float16 .

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

Dimensions

Vektor musí mít alespoň jednu dimenzi. Maximální počet podporovaných dimenzí je 1998.

Examples

A. Definice sloupce

Typ vektoru lze použít v definici sloupce obsaženém v příkazu CREATE TABLE, například:

Následující příklad vytvoří tabulku s vektorovým sloupcem a vloží do ní data.

Vektorový sloupec v tabulce můžete definovat buď pomocí výchozího základního typu (float32), nebo explicitně zadat float16 úložiště s poloviční přesností.

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

CREATE TABLE dbo.vectors
(
    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. Použití v proměnných

Následující příklad deklaruje vektory pomocí nového vektoru datového typu a vypočítá vzdálenosti pomocí funkce VECTOR_DISTANCE.

Typ vektoru lze použít s proměnnými:

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

C. Použití v uložených procedurách nebo funkcích

Datový typ vektoru lze použít jako parametr v uložené proceduře nebo funkcích. Například:

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

Dostupnost funkcí

Nový typ vektoru je k dispozici na všech úrovních kompatibility databáze.

Podpora vektorů je v současné době řízena pomocí konfigurace float16. Před použitím VECTOR(..., float16)je nutné jej explicitně povolit .

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • Vektorový typ nelze použít s typem sql_variant ani jej přiřadit k proměnné nebo sloupci typu sql_variant. Toto omezení se podobá varchar(max), varbinary(max), nvarchar(max), xml, json a datovým typům založeným na CLR.

Compatibility

Vylepšení protokolu TDS

SQL Server ukládá vektory v optimalizovaném binárním formátu, ale zpřístupňuje je jako pole JSON pro usnadnění.

Podporované ovladače používají vylepšení protokolu TDS k efektivnějšímu přenosu vektorových dat v binárním formátu a jejich prezentaci aplikacím jako nativních typů vektorů. Tento přístup snižuje velikost datové části, eliminuje režii analýzy JSON a zachovává plnou přesnost s plovoucí desetinnou čárkou. Výsledkem je zlepšení výkonu a přesnosti při práci s vysoce dimenzionálními vektory ve scénářích umělé inteligence a strojového učení.

Note

float16 vektory se v současné době přenášejí jako varchar(max) (pole JSON) přes TDS. Podpora float16 binárního přenosu ještě není k dispozici v ovladačích, jako jsou ODBC, JDBC a .NET.

Podpora nativních ovladačů

Aplikace využívající TDS verze 7.4 nebo vyšší a aktualizované ovladače můžou nativně číst, zapisovat, streamovat a hromadně kopírovat vektorová data.

Tyto funkce vyžadují verze následujících ovladačů. Ujistěte se, že k povolení podpory nativních vektorů používáte správnou verzi.

  • Microsoft.Data.SqlClient: Verze 6.1.0 zavádí typ SqlVector, který rozšiřuje System.Data.SqlDbTypes.
  • Ovladač Microsoft JDBC pro SQL Server: Verze 13.1.0 Preview představuje microsoft.sql.Types.VECTOR typ a microsoft.sql.Vector třídu.

Note

U klientů, kteří nepodporují aktualizovaný protokol TDS, SQL Server nadále zveřejňuje vektorová data jako typy varchar(max), aby se zajistila zpětná kompatibilita. Klientské aplikace můžou pracovat s vektorovými daty, jako by šlo o pole JSON. Databázový stroj SQL automaticky převádí vektory do a zpět z pole JSON, což činí nový typ transparentním pro klienta. Ovladače a všechny jazyky jsou proto automaticky kompatibilní s novým typem.

Nový typ vektoru můžete začít hned používat. Následující příklady ukazují různé jazyky a konfigurace ovladačů.

Important

Vyžaduje Microsoft.Data.SqlClient 6.1.0 nebo novější pro podporu nativních vektorů.

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

Pokud nepoužíváte nejnovější ovladače .NET, můžete dál pracovat s vektorovými daty v jazyce C# serializací a deserializací jako řetězcem JSON pomocí JsonSerializer třídy. Tím se zajistí kompatibilita se varchar(max) znázorněním vektorů vystavených SQL Serverem pro starší klienty.

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

Následující nástroje podporují datový typ vektoru :

Limitations

Typ vektoru má následující omezení:

Tables

  • Omezení na úrovni sloupců se nepodporují s výjimkou NULL/NOT NULL omezení.

    • Omezení DEFAULT a CHECK nejsou podporována pro vektorové sloupce.

    • U PRIMARY KEY sloupců se nepodporují klíčová omezení, například FOREIGN KEY nebo. Rovnost, jedinečnost, spojení využívající vektorové sloupce jako klíče a pořadí řazení se nevztahují na datové typy vektorů .

    • Neexistuje žádná koncepce jedinečnosti vektorů, takže jedinečná omezení nejsou použitelná.

    • Kontrola rozsahu hodnot v rámci vektoru se také nedá použít.

  • Vektory nepodporují porovnání, sčítání, odčítání, násobení, dělení, zřetězení ani jiné matematické, logické a složené operátory přiřazení.

  • Vektorové sloupce nelze použít v tabulkách optimalizovaných pro paměť.

Indexes

  • U vektorových sloupců nejsou povolené indexy B-tree ani indexy columnstore. Vektor sloupec je však možné zadat jako zahrnutý sloupec v definici indexu.

Metadata schématu tabulky

  • sp_describe_first_result_set systémová uložená procedura nevrací správně datový typ vektoru . Mnoho klientů a ovladačů pro přístup k datům proto vidí datový typ varchar nebo nvarchar.

Tabulky registru

  • Uložená procedura sp_verify_database_ledger vygeneruje chybu, pokud databáze obsahuje tabulku s vektorovým sloupcem.

Uživatelem definované typy

  • Vytvoření typu aliasu pomocí CREATE TYPE pro typ vektoru není povolené, podobně jako chování xml a datových typů json.

Trvale šifrováno

  • Funkce Always Encrypted nepodporuje typ vektoru.

Známé problémy

  • Maskování dat aktuálně zobrazuje vektorová data jako datový typ varbinary na webu Azure Portal.