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
테스트 내용 수정