다음을 통해 공유


벡터 데이터 형식(미리 보기)

적용 대상: Azure SQL Database

벡터 데이터 형식은 유사성 검색 및 기계 학습 애플리케이션과 같은 작업에 최적화된 벡터 데이터를 저장하도록 설계되었습니다. 벡터는 최적화된 이진 형식으로 저장되지만 편의를 위해 JSON 배열로 노출됩니다. 벡터의 각 요소는 단정밀도(4 바이트) 부동 소수점 값으로 저장됩니다.

참고 항목

이 데이터 형식은 미리 보기 상태이며 변경될 수 있습니다. 온라인 서비스용 SLA(서비스 수준 계약) 문서에서 미리 보기 사용 약관 을 읽어야 합니다 . 현재 미리 보기의 제한 사항은 제한 사항알려진 문제를 참조하세요.

SQL Database에서 벡터 데이터 작업에 대한 자세한 내용은 다음을 참조하세요.

샘플 구문

벡터 형식의 사용 구문은 테이블의 다른 모든 SQL Server 데이터 형식과 유사합니다.

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

차원

벡터에는 하나 이상의 차원이 있어야 합니다. 지원되는 최대 차원 수는 1998년입니다.

예제

A. 열 정의

벡터 형식은 문에 포함된 열 정의에서 CREATE TABLE 사용할 수 있습니다. 예를 들면 다음과 같습니다.

다음 예제에서는 벡터 열이 있는 테이블을 만들고 데이터를 삽입합니다.

CREATE TABLE dbo.vectors
(
  id INT PRIMARY KEY,
  v VECTOR(3) NOT NULL
);

INSERT INTO dbo.vectors (id, v) VALUES 
(1, '[0.1, 2, 30]'),
(2, '[-100.2, 0.123, 9.876]');

SELECT * FROM dbo.vectors;

B. 변수의 사용량

다음 예제에서는 새 벡터 데이터 형식을 사용하여 벡터를 선언하고 함수를 사용하여 VECTOR_DISTANCE 거리를 계산합니다.

벡터 형식은 변수와 함께 사용할 수 있습니다.

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

C. 저장 프로시저 또는 함수의 사용량

벡터 데이터 형식은 저장 프로시저 또는 함수에서 매개 변수로 사용할 수 있습니다. 예시:

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

기능 가용성

벡터에 대한 기본 지원은 현재 Azure SQL Database에서 미리 보기로 제공됩니다.

벡터 형식은 모든 데이터베이스 호환성 수준에서 사용할 수 있습니다.

호환성

모든 클라이언트가 벡터 데이터에서 작동할 수 있도록 벡터는 varchar(max) 형식으로 노출됩니다. 클라이언트 애플리케이션은 JSON 배열인 것처럼 벡터 데이터로 작업할 수 있습니다. 엔진은 JSON 배열과 벡터를 자동으로 변환하여 클라이언트에 대해 새 형식을 투명하게 만듭니다. 이 접근 방식 덕분에 모든 드라이버와 모든 언어가 새 형식과 자동으로 호환됩니다.

새 벡터 형식을 즉시 사용할 수 있습니다. 몇 가지 예는 다음과 같습니다.

C#을 사용하면 클래스를 사용하여 JsonSerializer 문자열 간 벡터를 직렬화하고 역직렬화할 수 있습니다.

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

제한 사항

진행 중인 미리 보기에는 다음과 같은 제한 사항이 있습니다.

테이블

  • 제약 조건을 제외하고 NULL/NOT NULL 열 수준 제약 조건은 지원되지 않습니다.
    • DEFAULTCHECK 제약 조건은 벡터 열에 대해 지원되지 않습니다.
    • 벡터 열과 같은 PRIMARY KEY FOREIGN KEY키 제약 조건은 지원되지 않습니다. 같음, 고유성, 벡터 열을 키로 사용하는 조인 및 정렬 순서는 벡터 데이터 형식에 적용되지 않습니다.
    • 벡터의 고유성에 대한 개념은 없으므로 고유한 제약 조건을 적용할 수 없습니다.
    • 벡터 내의 값 범위를 확인하는 것도 적용되지 않습니다.
  • 벡터는 비교, 더하기, 빼기, 곱하기, 나누기, 연결 또는 기타 수학, 논리 및 복합 할당 연산자를 지원하지 않습니다.
  • 메모리 최적화 테이블에서는 벡터 열을 사용할 수 없습니다.
  • 다른 데이터 형식을 사용하여 ALTER TABLE ... ALTER COLUMN 벡터 열을 변경하는 것은 허용되지 않습니다.

테이블 스키마 메타데이터

  • sp_describe_first_result_set 시스템 저장 프로시저가 벡터 데이터 형식을 올바르게 반환하지 않습니다. 따라서 많은 데이터 액세스 클라이언트와 드라이버는 varchar 또는 nvarchar 데이터 형식을 볼 수 있습니다.

  • INFORMATION_SCHEMA.COLUMNS는 벡터 형식을 varbinary로 사용하여 열을 보고합니다. 올바른 데이터 형식을 가져오는 해결 방법은 시스템 보기를 사용하는 sys.columns 것입니다.

  • sys.columns 는 벡터 길이(바이트)를 반환합니다. 차원 수를 얻으려면 다음 수식을 사용합니다.

    dimensions = (length - 8) / 4
    

    여기서 length 반환되는 값 max_length은 다음과 입니다. 예를 들어 20바이트가 표시 max_length 되면 차원 수는 (20 - 8) / 4 = 3입니다.

변환

  • 벡터 형식을 사용 CAST 하거나 CONVERT 벡터 형식에서의 암시적 및 명시적 변환을 varchar수행할 수 있으며, 마찬가지로 nvarchar 형식은 varchar 및 nvarchar암시적으로 또는 명시적으로 벡터 형식으로 변환할 수 있습니다.

  • 벡터 형식은 sql_variant 형식과 함께 사용하거나 sql_variant 변수 또는 열에 할당할 없습니다. 이 제한은 varchar(max), varbinary(max), nvarchar(max), xml, json 및 CLR 기반 데이터 형식과 유사합니다.

  • JSON 데이터 형식으로의 캐스팅은 아직 지원되지 않습니다. 해결 방법은 먼저 nvarchar(max)에서 Nvarchar(max) 로 변환한 다음 JSON으로/에서 변환하는 것입니다. 예를 들어 벡터를 JSON 형식으로 변환하려면 다음을 수행합니다.

    DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
    SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;
    

    JSON 형식에서 벡터로 변환하려면 다음을 수행합니다.

    DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30)
    SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;
    

인덱스

  • B-트리 인덱스 또는 columnstore 인덱스는 벡터 열에서 허용되지 않습니다. 그러나 벡터 열은 인덱스 정의에 포함된 열로 지정할 수 있습니다.

사용자 정의 형식

  • xml 및 json 데이터 형식의 동작유사하게 벡터 형식에 사용하는 CREATE TYPE 별칭 형식 만들기는 허용되지 않습니다.

원장 테이블

  • 데이터베이스에 벡터 열이 있는 테이블이 포함된 경우 저장 프로시저 sp_verify_database_ledger 에서 오류가 발생합니다.

알려진 문제

진행 중인 미리 보기에는 다음과 같은 알려진 문제가 있습니다.

  • SQL Server Management Studio, Azure Data Studio 또는 VS Code용 mssql 확장과 같은 도구는 현재 벡터 데이터 형식을 사용하여 열이 있는 테이블의 스크립트를 생성하지 못할 수 있습니다.
  • SQL Server Management Studio, Azure Data Studio 또는 VS Code용 mssql 확장과 같은 도구는 현재 벡터 형식을 사용하는 열에 대한 벡터 대신 varbinary데이터 형식을 보고할 수 있습니다.
  • 테이블에 벡터 형식이 포함된 경우 BCP 및 BULK INSERT 현재 작동하지 않습니다.
  • 벡터 형식을 사용하는 테이블이 있는 경우 현재 DacFx를 통한 가져오기 및 내보내기가 작동하지 않습니다.
  • 열 암호화는 현재 벡터 형식을 지원하지 않습니다.
  • Always Encrypted는 현재 벡터 유형을 지원하지 않습니다.
  • 데이터 마스킹은 현재 포털에서 벡터 데이터를 varbinary 데이터 형식으로 표시합니다.
  • 벡터 형식을 LEN 전달하고 DATALENGTH 오류 8116(데이터장 함수의 인수 1에 인수 데이터 형식 벡터가 유효하지 않음)이 반환됩니다.
  • 저장 프로시저 또는 함수에 벡터를 전달하는 경우 오류 42211이 발생할 수 있습니다(변환 중에는 벡터 잘림이 허용되지 않음). 해결 방법은 nvarchar(max)를 대신 벡터 형식으로 사용하는 것입니다.

이러한 문제는 향후 업데이트에서 해결될 예정이며 설명서는 그에 따라 업데이트될 예정입니다.