StarRocks를 포함한 표준 SQL의 View(뷰)는 매개변수(Parameter)를 직접 전달받는 '파라미터화된 뷰(Parameterized View)' 기능을 지원하지 않습니다.
대신 1) 기본 단위의 Base View에 WHERE 절을 동적 적용하거나 2) 애플리케이션(API) 레이어에서 파라미터 바인딩 쿼리를 사용하여 완전한 동적 조회를 구현할 수 있습니다.
방법 1. Base View + 동적 WHERE 필터링 (가장 권장)
bucket과 prefix별로 프리-집계(Pre-aggregated)된 View를 만들어 두고, 조회 시점에 bucket과 prefix를 파라미터로 주입하여 상위 재귀 집계를 실행합니다. 원본 데이터를 스캔하지 않고 프리-집계 결과만 재합산하므로 매우 빠릅니다.
-- 1. Base View 생성 (기본 단위 집계)
CREATE VIEW IF NOT EXISTS v_prefix_summary AS
SELECT
bucket,
prefix,
COUNT(1) AS total_object_count,
COALESCE(SUM(size_bytes), 0) AS total_size_bytes
FROM object_current_state
WHERE __deleted = 0
GROUP BY bucket, prefix;
-- 2. 동적 조회 Query (API/앱에서 'my-bucket'과 'aoo'를 동적으로 전달)
SELECT
bucket,
'aoo' AS searched_prefix,
SUM(total_object_count) AS total_object_count,
SUM(total_size_bytes) AS total_size_bytes
FROM v_prefix_summary
WHERE bucket = 'my-bucket' -- 동적 인자 1: bucket
AND (prefix = 'aoo' OR prefix LIKE 'aoo/%') -- 동적 인자 2: prefix
GROUP BY bucket;
방법 2. API / Backend 코드 연동 (Python/FastAPI 예시)
백엔드 서비스나 플랫폼 API에서 파라미터만 받아 동적으로 SQL을 안전하게 매핑하는 방식입니다.
import pymysql
def get_prefix_metadata(bucket: str, prefix: str):
# Prefix가 있는 경우와 없는(루트) 경우 처리
prefix_clean = prefix.strip('/')
sql = """
SELECT
bucket,
%s AS target_prefix,
SUM(total_object_count) AS total_object_count,
SUM(total_size_bytes) AS total_size_bytes
FROM v_prefix_summary
WHERE bucket = %s
AND (prefix = %s OR prefix LIKE CONCAT(%s, '/%%'))
GROUP BY bucket;
"""
conn = pymysql.connect(host='localhost', port=9030, user='root', password='', db='minio_metadata')
with conn.cursor(pymysql.cursors.DictCursor) as cursor:
cursor.execute(sql, (prefix_clean, bucket, prefix_clean, prefix_clean))
result = cursor.fetchone()
return result or {"bucket": bucket, "target_prefix": prefix_clean, "total_object_count": 0, "total_size_bytes": 0}
# 사용 예시
# get_prefix_metadata("my-bucket", "aoo")
방법 3. SQL 세션 내 Prepared Statement (DB 세션 동적 실행)
DB CLI나 세션 내에서 파라미터 변수를 선언하여 동적으로 실행하는 방법입니다.
-- 파라미터 변수 준비 및 바인딩
SET @target_bucket = 'my-bucket';
SET @target_prefix = 'aoo';
SET @like_prefix = CONCAT(@target_prefix, '/%');
PREPARE stmt FROM '
SELECT
bucket,
? AS target_prefix,
SUM(total_object_count) AS total_object_count,
SUM(total_size_bytes) AS total_size_bytes
FROM v_prefix_summary
WHERE bucket = ?
AND (prefix = ? OR prefix LIKE ?)
GROUP BY bucket;
';
EXECUTE stmt USING @target_prefix, @target_bucket, @target_prefix, @like_prefix;
DEALLOCATE PREPARE stmt;