Search

SingleStore Vector의 높은 Dimension

문서번호 : 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
테스트 내용 수정
📧