문서번호 : 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 | 오탈자 수정 |

