비용 모니터링 & 최적화
쿼리 실행 비용을 추적하고, 부서별 예산을 관리하며, 쿼리 최적화 방법을 안내합니다.

사전 준비
- 관리자(admin) 권한으로 로그인
- Trino Event Listener가 비용 데이터를 수집하고 있어야 합니다
- 샘플 쿼리가 실행된 이력이 있어야 합니다
비용 모니터링 개요
GenD는 Trino Event Listener를 통해 모든 쿼리의 실행 비용을 자동으로 수집합니다:
| 메트릭 | 설명 | 단위 |
|---|---|---|
| CPU Time | 쿼리 처리에 사용된 CPU 시간 | ms |
| Scan Bytes | 스캔된 데이터 크기 | bytes |
| Wall Time | 실제 경과 시간 | ms |
| Peak Memory | 최대 메모리 사용량 | bytes |
1단계: 비용 대시보드 확인
사이드바 하단 ⚙ 관리 콘솔 → 운영 & 모니터링 → 비용 대시보드 메뉴를 클릭합니다.
대시보드 요약
상단에 전체 비용 요약이 표시됩니다:
| 항목 | 설명 |
|---|---|
| 총 쿼리 수 | 기간 내 실행된 전체 쿼리 수 |
| 총 스캔 바이트 | 기간 내 스캔된 총 데이터량 |
| 총 CPU 시간 | 기간 내 소비된 총 CPU 시간 |
| 평균 응답 시간 | 쿼리 평균 Wall Time |
사용자별 비용 요약

사용자별로 집계된 비용 요약:
| 사용자 | 쿼리 수 | 총 스캔(GB) | 총 CPU(s) | 평균 응답(ms) |
|---|---|---|---|---|
| admin | 150 | 12.5 | 45.2 | 320 |
| analyst | 280 | 8.3 | 28.7 | 180 |
| data-engineer | 95 | 25.1 | 82.4 | 890 |
2단계: 부서별 예산 설정
2-1. 예산 생성
비용 대시보드에서 예산 설정 버튼을 클릭합니다.
| 필드 | 값 | 설명 |
|---|---|---|
| 팀 이름 | marketing | 부서/팀 식별자 |
| 월 예산 | 100 GB | 월간 스캔 바이트 한도 |
| 알림 임계치 | 80% | 예산 80% 도달 시 알림 |
2-2. 예산 현황 모니터링
| 팀 | 월 예산 | 현재 사용량 | 사용률 | 상태 |
|---|---|---|---|---|
| marketing | 100 GB | 45 GB | 45% | 🟢 정상 |
| finance | 200 GB | 178 GB | 89% | 🟡 주의 |
| data-eng | 500 GB | 320 GB | 64% | 🟢 정상 |
경고
예산 초과 시 쿼리가 차단되지는 않지만, 알림이 발생하고 감사 로그에 기록됩니다.
3단계: 고비용 쿼리 식별
스캔 바이트 Top 10
비용 대시보드에서 스캔 바이트 기준으로 정렬합니다:
| 순위 | 사용자 | 쿼리 요약 | 스캔(GB) | CPU(s) | 시간(ms) |
|---|---|---|---|---|---|
| 1 | data-eng | SELECT * FROM transactions | 8.2 | 12.5 | 3,200 |
| 2 | analyst | JOIN customers × transactions | 5.1 | 8.3 | 2,100 |
| 3 | admin | COUNT(*) GROUP BY ALL | 3.8 | 6.2 | 1,800 |
비용 분석 관점
- Full Table Scan:
SELECT *는 전체 테이블을 스캔 → 컬럼 지정 필요 - Cross-Join 위험: JOIN 조건 없는 카테시안 곱 → WHERE 조건 필수
- 파티션 미활용: 파티션 키로 필터링하지 않으면 전체 파티션 스캔
4단계: 쿼리 최적화 가이드
최적화 1: 컬럼 지정
-- ❌ 비효율: 모든 컬럼 스캔
SELECT * FROM iceberg.card.transactions LIMIT 100;
-- ✅ 최적: 필요한 컬럼만 지정
SELECT txn_id, amount, channel, txn_datetime
FROM iceberg.card.transactions
LIMIT 100;
효과: Iceberg 파일 포맷은 컬럼 스토어이므로, 필요한 컬럼만 읽어 스캔 바이트 80% 절감 가능
최적화 2: 파티션 활용
-- ❌ 비효율: 전체 파티션 스캔
SELECT COUNT(*) FROM iceberg.card.transactions
WHERE amount > 100000;
-- ✅ 최적: 날짜 파티션으로 범위 제한
SELECT COUNT(*) FROM iceberg.card.transactions
WHERE txn_datetime >= DATE '2026-01-01'
AND txn_datetime < DATE '2026-04-01'
AND amount > 100000;
효과: 파티션 프루닝으로 스캔 범위 75% 감소
최적화 3: 집계 먼저, JOIN 나중에
-- ❌ 비효율: JOIN 후 집계
SELECT c.risk_grade, COUNT(*), SUM(t.amount)
FROM sourcedb.public.customers c
JOIN iceberg.card.transactions t ON c.customer_id = t.customer_id
GROUP BY c.risk_grade;
-- ✅ 최적: 서브쿼리로 집계 먼저
SELECT c.risk_grade, agg.txn_count, agg.total_amount
FROM sourcedb.public.customers c
JOIN (
SELECT customer_id, COUNT(*) AS txn_count, SUM(amount) AS total_amount
FROM iceberg.card.transactions
GROUP BY customer_id
) agg ON c.customer_id = agg.customer_id
GROUP BY c.risk_grade, agg.txn_count, agg.total_amount;
효과: 중간 결과 크기 감소로 메모리 사용량 절감
최적화 4: LIMIT 활용
-- 탐색적 분석 시 항상 LIMIT 사용
SELECT * FROM iceberg.card.transactions
ORDER BY amount DESC
LIMIT 20;
5단계: 비용 알림 설정
비용 임계치 초과 시 알림을 받을 수 있습니다:
| 알림 유형 | 조건 | 수신 |
|---|---|---|
| 단일 쿼리 | 스캔 > 10GB | 쿼리 실행자 + admin |
| 일일 사용량 | 일 총합 > 50GB | 팀 리더 |
| 월 예산 | 사용률 > 80% | admin + 팀 리더 |
6단계: PII 비용 연관 분석
PII 마스킹이 적용된 쿼리는 추가 처리 비용이 발생합니다.

사이드바 하단 ⚙ 관리 콘솔 → 접근 제어 & 보안 → PII 관리 메뉴에서 마스킹 정책이 설정된 컬럼을 확인합니다. Column Mask는 SQL 변환 시 추가 연산을 수행하므로, 마스킹된 컬럼을 SELECT하는 쿼리의 CPU 시간이 약 5~10% 증가합니다.
AI Agent Chat으로 수행하기
사용자: "이번 달 부서별 쿼리 비용 현황 보여줘"
AI: [get_cost_summary 호출] → 이번 달 비용 현황입니다:
- marketing: 45GB/100GB (45%)
- finance: 178GB/200GB (89%) ⚠️ 주의
- data-eng: 320GB/500GB (64%)
finance 팀의 예산 사용률이 높습니다. 고비용 쿼리를 확인하시겠습니까?
사용자: "finance 팀 고비용 쿼리 Top 5 보여줘"
AI: [get_query_costs 호출] → finance 팀 상위 5개 쿼리:
1. SELECT * FROM transactions (8.2GB) — 컬럼 지정 권장
2. JOIN customers × transactions (5.1GB) — 날짜 필터 추가 권장
...