벡터 데이터 형식(미리 보기)
적용 대상: 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
열 수준 제약 조건은 지원되지 않습니다.DEFAULT
및CHECK
제약 조건은 벡터 열에 대해 지원되지 않습니다.- 벡터 열과 같은
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)를 대신 벡터 형식으로 사용하는 것입니다.
이러한 문제는 향후 업데이트에서 해결될 예정이며 설명서는 그에 따라 업데이트될 예정입니다.