Delen via


Vectorgegevenstype

Van toepassing op: SQL Server 2025 (17.x) Preview AzureSQL Database Azure SQL Managed InstanceSQL-databasein Microsoft Fabric Preview

Het vectorgegevenstype is ontworpen om vectorgegevens op te slaan die zijn geoptimaliseerd voor bewerkingen zoals overeenkomsten zoeken en machine learning-toepassingen. Vectoren worden opgeslagen in een geoptimaliseerde binaire indeling, maar worden voor het gemak weergegeven als JSON-matrices. Elk element van de vector wordt opgeslagen als een drijvende-kommawaarde met enkelvoudige precisie (4 bytes).

Voor een vertrouwde ervaring voor ontwikkelaars wordt het vectorgegevenstype gemaakt en weergegeven als een JSON-matrix. Een vector met drie dimensies kan bijvoorbeeld worden weergegeven als '[0.1, 2, 30]'. Impliciete en expliciete conversie van en naar het vectortype kan worden uitgevoerd met varchar-, nvarchar- en json-typen.

Note

SQL Server 2025 (17.x) Preview ondersteunt halfprecisie (float16) vectors.

Kijk hier voor meer informatie.

float16 vector is momenteel beschikbaar voor preview. Als u wilt testen, schakelt u de configuratieoptie voor databasebereik PREVIEW_FEATURES in. Raadpleeg PREVIEW_FEATURES = { AAN | UIT }.

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Note

Raadpleeg beperkingen en bekende problemen voor beperkingen.

Vectorfuncties zijn beschikbaar in Azure SQL Managed Instance dat is geconfigureerd met het beleid Always-up-to-date .

Zie voor meer informatie over het werken met vectorgegevens:

Voorbeeldsyntaxis

De gebruiksyntaxis voor het vectortype is vergelijkbaar met alle andere SQL Server-gegevenstypen in een tabel.

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

Standaard is het basistype float32. Als u halve precisie wilt gebruiken, moet u float16 expliciet opgeven

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

Dimensions

Een vector moet ten minste één dimensie hebben. Het maximum aantal ondersteunde dimensies is 1998.

Examples

A. Kolomdefinitie

Het vectortype kan worden gebruikt in de kolomdefinitie in een CREATE TABLE instructie, bijvoorbeeld:

In het volgende voorbeeld wordt een tabel met een vectorkolom gemaakt en worden er gegevens in ingevoegd. U kunt een VECTOR kolom in een tabel definiëren met behulp van het standaardbasistype (float32) of expliciet opgeven float16 voor halve precisieopslag.

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. Gebruik in variabelen

In het volgende voorbeeld worden vectoren gedeclareert met behulp van het nieuwe vectorgegevenstype en worden afstanden berekend met behulp van de VECTOR_DISTANCE functie.

Het vectortype kan worden gebruikt met variabelen:

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

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

C. Gebruik in opgeslagen procedures of functies

Het gegevenstype vector kan worden gebruikt als parameter in opgeslagen procedure of functies. Voorbeeld:

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

Beschikbaarheid van functies

Het nieuwe vectortype is beschikbaar op alle databasecompatibiliteitsniveaus.

Ondersteuning voor float16 vectoren is momenteel beperkt tot de PREVIEW_FEATURES configuratie. U moet deze expliciet inschakelen voordat u deze gebruikt VECTOR(..., float16).

ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

Conversions

  • Het vectortype kan niet worden gebruikt met het sql_variant type of toegewezen aan een sql_variant variabele of kolom. Deze beperking is vergelijkbaar met varchar(max), varbinary(max), nvarchar(max), xml, json en CLR-gegevenstypen.

Compatibility

Verbeteringen aan TDS-protocol

SQL Server slaat vectoren op in een geoptimaliseerde binaire indeling, maar maakt ze beschikbaar als JSON-matrices voor het gemak. Ondersteunde stuurprogramma's gebruiken verbeteringen in het TDS-protocol om vectorgegevens efficiënter in binaire indeling te verzenden en deze als systeemeigen vectortypen aan toepassingen te presenteren. Deze aanpak vermindert de payloadgrootte, elimineert de overhead van JSON-parsering en behoudt volle floating-point precisie. Hierdoor worden zowel de prestaties als de nauwkeurigheid verbeterd bij het werken met high-dimensionale vectoren in AI- en machine learning-scenario's.

Note

float16 vectoren worden momenteel verzonden als VARCHAR(MAX) (JSON-matrix) via TDS. Ondersteuning voor binair transport voor float16 is nog niet beschikbaar in stuurprogramma's zoals ODBC, JDBC en .NET.

Ondersteuning voor systeemeigen stuurprogramma's

Toepassingen die gebruikmaken van TDS versie 7.4 of hoger en bijgewerkte stuurprogramma's kunnen systeemeigen vectorgegevens lezen, schrijven, streamen en bulksgewijs kopiëren.

Voor deze mogelijkheden zijn versies van de onderstaande stuurprogramma's vereist. Zorg ervoor dat u de juiste versie gebruikt om systeemeigen vectorondersteuning in te schakelen.

  • Microsoft.Data.SqlClient: versie 6.1.0 introduceert het SqlVector type uitbreiding System.Data.SqlDbTypes.
  • Microsoft JDBC-stuurprogramma voor SQL Server: versie 13.1.0 Preview introduceert het microsoft.sql.Types.VECTOR type en de microsoft.sql.Vector klasse.

Note

Voor clients die het bijgewerkte TDS-protocol niet ondersteunen, blijft SQL Server vectorgegevens beschikbaar maken als varchar(max) -typen om compatibiliteit met eerdere versies te garanderen. Clienttoepassingen kunnen werken met vectorgegevens alsof het een JSON-matrix is. De SQL Database Engine converteert automatisch vectoren van en naar een JSON-matrix, waardoor het nieuwe type transparant is voor de client. Daarom zijn stuurprogramma's en alle talen automatisch compatibel met het nieuwe type.

U kunt het nieuwe vectortype meteen gaan gebruiken. In de volgende voorbeelden ziet u verschillende talen en stuurprogrammaconfiguraties.

Important

Hiervoor is Microsoft.Data.SqlClient 6.1.0 of hoger vereist voor systeemeigen vectorondersteuning.


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

Als u niet de nieuwste .NET-stuurprogramma's gebruikt, kunt u nog steeds werken met vectorgegevens in C# door deze te serialiseren en deserialiseren als een JSON-tekenreeks met behulp van de JsonSerializer klasse. Dit zorgt voor compatibiliteit met de varchar(max) weergave van vectoren die worden weergegeven door SQL Server voor oudere clients.

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

De volgende hulpprogramma's ondersteunen het gegevenstype vector :

Limitations

Het vectortype heeft de volgende beperkingen:

Tables

  • Beperkingen op kolomniveau worden niet ondersteund, met uitzondering van NULL/NOT NULL beperkingen.
    • DEFAULT en CHECK beperkingen worden niet ondersteund voor vectorkolommen .
    • Belangrijke beperkingen, zoals PRIMARY KEY of FOREIGN KEY, worden niet ondersteund voor vectorkolommen . Gelijkheid, uniekheid, joins met behulp van vectorkolommen als sleutels en sorteervolgordes zijn niet van toepassing op vectorgegevenstypen .
    • Er is geen idee van uniekheid voor vectoren, dus unieke beperkingen zijn niet van toepassing.
    • Het controleren van het bereik van waarden binnen een vector is ook niet van toepassing.
  • Vectoren bieden geen ondersteuning voor vergelijkingen, optellen, aftrekken, vermenigvuldigen, delen, samenvoegen of andere rekenkundige, logische en samengestelde toewijzingsoperatoren.
  • vectorkolommen kunnen niet worden gebruikt in tabellen die zijn geoptimaliseerd voor geheugen.

Indexes

  • B-tree-indexen of columnstore-indexen zijn niet toegestaan voor vectorkolommen . Een vectorkolom kan echter worden opgegeven als een opgenomen kolom in een indexdefinitie.

Metagegevens van tabelschema

  • sp_describe_first_result_set systeem opgeslagen procedure retourneert het gegevenstype vector niet correct. Daarom zien veel clients en stuurprogramma's voor gegevenstoegang een varchar - of nvarchar-gegevenstype .

Grootboektabellen

  • Met de opgeslagen procedure sp_verify_database_ledger wordt een fout gegenereerd als de database een tabel met een vectorkolom bevat.

Door de gebruiker gedefinieerde typen

  • Het maken van aliastypen die worden gebruikt CREATE TYPE voor het vectortype is niet toegestaan, vergelijkbaar met het gedrag van de xml- en json-gegevenstypen.

Altijd versleuteld

  • vectortype wordt niet ondersteund met de functie Always Encrypted.

Bekende problemen

  • Gegevensmaskering toont momenteel vectorgegevens als varbinair gegevenstype in Azure Portal.