문서번호 : 11-3899554
Document Information
•
최초 작성일 : 2025.12.17
•
최종 수정일 : 2026.02.09
•
이 문서는 아래 버전을 기준으로 작성되었습니다.
◦
Singlestore : 8.9.40
Goal
SignleStore 의 High-Dimensional 벡터에 대한 지원을 확인합니다.
개요
RAG 시스템, 시맨틱 서치와 같은 최신 AI 애플리케이션에서는 멀티모달 임베딩이나 대규모 데이터를 High-Dimensional 벡터(높은 Dimension을 가지는 벡터)형태로 저장하고 처리하고자 하는 요구가 있습니다. 이러한 워크로드는 High-Dimensional 벡터 데이터를 오류나 장애 없이 안정적으로 저장, 인덱싱, 쿼리할 수 있는 데이터베이스 시스템에 의존합니다.
SingleStore 는 대규모 벡터 저장 및 쿼리 워크로드를 처리하도록 설계되었으며, High-Dimensional 벡터에 대해서도 빠른 인덱싱과 효율적인 쿼리를 제공합니다.
Solution
High-Dimensional 벡터 테스트
SignleStore 의 High-Dimensional 벡터에 대한 지원을 확인하기 위해, 16K 부터 128K 까지의 Dimension 을 가지는 벡터를 대상으로 테스트를 수행했습니다.
본 테스트를 통해 SingleStore 가 다음과 같은 벡터 연산을 오류 없이 안정적으로 처리할 수 있음을 확인했습니다.
•
벡터 인덱스 생성
•
High-Dimensional 벡터 데이터 INSERT
•
벡터 정규화 (Vector Normalization)
•
KNN (K-Nearest Neighbors) 검색
•
ANN (Approximate Nearest Neighbors) 검색
Test Results
벡터 count | Dimension | 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 상에서는 벡터 dimension 으로 최대 1,073,741,824 (1GB) 까지 정의가 가능합니다. 그러나 벡터 데이터를 INSERT 할 때는 단일 벡터의 데이터 크기가 max_allowed_packet 설정 값을 초과할 수 없으며, 이 값이 실제 적재 가능한 최대 벡터 크기를 결정하는 주요 제약으로 작용합니다.
max_allowed_packet 의 기본 값은 100MB(104,857,600) 이며, 최대 1GB 까지 설정할 수 있습니다.
사용 가능한 최대 Dimension 추정
사용 가능한 벡터의 최대 Dimension 은 아래와 같은 계산식을 통해 추정할 수 있습니다. 단, 실제로 사용 가능한 최대 Dimension은 데이터 전송 제한(max_allowed_packet 등) 및 내부 오버헤드로 인해 계산된 값보다 작을 수 있습니다.
# F32 기준
최대 벡터 Dimension = max_allowed_packet ÷ 4 bytes
Notion Formula
복사
최대 Dimension 계산 예시 (F32 기준)
•
max_allowed_packet = 100MB→ 약 2,600만 dimension
•
max_allowed_packet = 1GB→ 약 2억 6천만 dimension
※ 이는 이론적인 값이며, 실제 사용 시에는 다른 요인에 의한 제한이 있을 수 있습니다.
최대 Dimension 추정치 검증을 위한 테스트
•
예시: max_allowed_packet 값을 104448 로 설정
최대 벡터 dimension = (104448 / 4) ≒ 26112
SQL
복사
•
추정한 dimension 보다 작은 값(20,000)으로 벡터 컬럼 생성 및 데이터 적재
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(20000, f32) not null);
Query OK, 0 rows affected (0.02 sec)
$ cat insert_test.py
import singlestoredb as s2
import time
import json
# Database configuration
DB_HOST = "localhost"
PORT = 3306
USER = "root"
PASSWORD = "test1@#"
DB = "db1"
conn = s2.connect(host=DB_HOST, port=PORT, user=USER, password=PASSWORD, database=DB)
cursor = conn.cursor()
dim_length = 20000
vector = [0.0] * dim_length
vector_str = json.dumps(vector)
cursor.execute(
"insert into vector_tbl (vec) values (%s)",
(vector_str,)
)
conn.commit()
print(f"Insert successful. Rows inserted: {cursor.rowcount}")
conn.close()
cursor.close
# 추정한 dimension 값보다 작은 20,000 으로 설정하여 INSERT 수행 시 정상 적재
$ python insert_test.py
Insert successful. Rows inserted: 1
Python
복사
•
추정한 dimension 보다 큰 값(26,200)으로 벡터 컬럼 생성 및 데이터 적재
singlestore> create table vector_tbl_2 (vec vector(26200) not null);
Query OK, 0 rows affected (0.02 sec)
$ cat insert_test.py
import singlestoredb as s2
import time
import json
# Database configuration
DB_HOST = "localhost"
PORT = 3306
USER = "root"
PASSWORD = "test1@#"
DB = "db1"
conn = s2.connect(host=DB_HOST, port=PORT, user=USER, password=PASSWORD, database=DB)
cursor = conn.cursor()
dim_length = 26200
vector = [0.0] * dim_length
vector_str = json.dumps(vector)
cursor.execute(
"insert into vector_tbl_2 (vec) values (%s)",
(vector_str,)
)
conn.commit()
print(f"Insert successful. Rows inserted: {cursor.rowcount}")
conn.close()
cursor.close
# 추정한 dimension 값보다 큰 26,200 으로 설정하여 INSERT 수행 시 오류 발생
$ python test.py
singlestoredb.exceptions.OperationalError: 1158: Error reading packet 1 from the connection socket (27): File too large
Python
복사
History
일자 | 작성자 | 비고 |
2025.12.17 | mike | 최초작성 |
2026.01.29 | jwy | 오탈자 수정 |
2026.02.09 | mk.Kang | 테스트 내용 수정 |
