Search

SingleStore Vector의 높은 Dimension

문서번호 : 11-3899554

Document Information

최초 작성일 : 2025.12.17
최종 수정일 : 2026.01.29
이 문서는 아래 버전을 기준으로 작성되었습니다.
Singlestore : 8.9.40

Goal

개요

특정 워크로드는 멀티모달 임베딩나 다량의 값을 벡터 형태로 저장해야 할 때가 있으며, 이는 보통 High-Dimensional 벡터로 표현됩니다. 여기에는 RAG 시스템, 시멘틱 서치 등과 같은 최신 AI 애플리케이션이 포함됩니다. 이러한 워크로드는 오류나 장애 없이 High-Dimensional 벡터 데이터를 안정적으로 저장, 인덱싱, 쿼리할 수 있는 데이터베이스 시스템에 의존합니다.
SingleStore는 High-Dimensional 벡터 데이터를 지원하며, 대규모 벡터 저장 및 쿼리 워크로드를 처리하도록 설계되었습니다. 매우 많은 Dimension을 가지는 벡터에 대해 인덱싱과 효율적인 쿼리를 제공합니다.

Solution

벡터의 높은 Dimension

High-Dimensional 벡터 워크로드에 대한 지원을 검증하기 위해, 16K 부터 128K 까지의 Dimension을 가지는 벡터를 대상으로 테스트를 수행했습니다.
해당 테스트는 SingleStore에서 제공하는 모든 벡터 관련 데이터베이스 및 벡터 Operation을 포함합니다.
Vector의 높은 Dimension Insert Operation
인덱스 생성
벡터 정규화
KNN (K-Nearest Neighbors) 검색
ANN (Approximate Nearest Neighbors) 검색
테스트 결과를 통해, SingleStore가 High-Dimensional Vector를 오류 없이 처리할 수 있음을 확인했습니다.

Test Results

벡터 수
차원
1개 벡터 데이터 크기 (kb)
총 데이터 크기 (gb)
벡터 정규화
Dot Prooduct (KNN)
Euclidean Distance (KNN)
Dot Prooduct (ANN)
Euclidean Distance (ANN)
1M
16,384
64
61
500K
32,768
128
61
400K
65,536
256
98
200K
131,072
512
98

벡터 Dimension 제한

SingleStore는 내부적으로 매우 높은 Dimension의 벡터을 처리할 수 있습니다. 그러나 실제로 사용 가능한 최대 벡터 Dimension는 데이터베이스 엔진의 한계가 아니라 데이터 전송 프로토콜 같은 외부 제약에 의해 결정됩니다.
예를 들어 FLOAT32 벡터 컬럼을 사용할 경우, DDL에서는 최대 1GB까지의 벡터 차원을 정의할 수 있습니다. 하지만 벡터 값을 Insert할 때는 단일 벡터의 크기가 max_allowed_packet 값을 초과할 수 없습니다.
max_allowed_packet의 기본값은 100MB이며, 최대 1GB까지 증가시킬 수 있습니다.

Dimension 제한 계산

최대 지원 벡터 Dimension은 다음 공식을 사용하여 추정할 수 있다. 실제 Dimension 길이는 계산된 값보다 작아야 합니다.
최대 벡터 Dimension = max_allowed_packet (bytes) ÷ 4 (F32 기준)
Plain Text
복사
max_allowed_packet = 100MB(기본값) → 최대 이론적 상한은 약 ~2,600만 차원
max_allowed_packet = 1GB(최대) → 최대 이론적 상한은 약 ~2억 6천만 차원

계산 예시

예시: max_allowed_packet 값 104448로 설정
최대 벡터 dimension = (104448 / 4) ~ 26112 차원
SQL
복사
테이블 생성
singlestore> set global max_allowed_packet = 104448; singlestore> select @@max_allowed_packet; +----------------------+ | @@max_allowed_packet | +----------------------+ | 104448 | +----------------------+ 1 row in set (0.00 sec) singlestore> create table vector_tbl (vec vector(20112, f32) not null); Query OK, 0 rows affected (0.02 sec)
SQL
복사
Vector 데이터 생성, 테이블에 데이터 Insert 및 결과 확인
import singlestoredb as s2 import time import json # Database configuration DB_HOST = "localhost" PORT = 3306 USER = "root" PASSWORD = "1" DB = "db1" conn = s2.connect(host=DB_HOST, port=PORT, user=USER, password=PASSWORD, database=DB) cursor = conn.cursor() dim_length = 20112 vector = [0.0] * dim_length vector_str = json.dumps(vector) cursor.execute( "insert into t1 (vec) values (%s)", (vector_str,) ) conn.commit() print(f"Insert successful. Rows inserted: {cursor.rowcount}") conn.close() cursor.close $ python test.py Insert successful. Rows inserted: 1
Python
복사
설정된 max_allowed_packet 기준으로 계산된 dimension을 초과하는 테이블을 생성할 경우, 테이블 생성 자체는 성공하지만 데이터 INSERT 시 실패합니다.
singlestore> create table vector_tbl (vec vector(26112) not null); Query OK, 0 rows affected (0.02 sec)
Python
복사
예를 들어, dimension을 26,112 또는 이에 근접한 값으로 설정하여 INSERT를 수행하면 다음과 같은 오류가 발생합니다.
$ python test.py singlestoredb.exceptions.OperationalError: 1158: Error reading packet 1 from the connection socket (27): File too large
Bash
복사

History

일자
작성자
비고
2025.12.17
mike
최초작성
2026.01.29
jwy
오탈자 수정