26Z07d

Young-Kyoo Kim·2026년 8월 7일

StarRocks를 포함한 표준 SQL의 View(뷰)는 매개변수(Parameter)를 직접 전달받는 '파라미터화된 뷰(Parameterized View)' 기능을 지원하지 않습니다.

대신 1) 기본 단위의 Base View에 WHERE 절을 동적 적용하거나 2) 애플리케이션(API) 레이어에서 파라미터 바인딩 쿼리를 사용하여 완전한 동적 조회를 구현할 수 있습니다.


방법 1. Base View + 동적 WHERE 필터링 (가장 권장)

bucketprefix별로 프리-집계(Pre-aggregated)된 View를 만들어 두고, 조회 시점에 bucketprefix를 파라미터로 주입하여 상위 재귀 집계를 실행합니다. 원본 데이터를 스캔하지 않고 프리-집계 결과만 재합산하므로 매우 빠릅니다.

-- 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;

0개의 댓글