본문으로 건너뛰기

비용 모니터링 & 최적화

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

비용 대시보드

사전 준비

  • 관리자(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)
admin15012.545.2320
analyst2808.328.7180
data-engineer9525.182.4890

2단계: 부서별 예산 설정

2-1. 예산 생성

비용 대시보드에서 예산 설정 버튼을 클릭합니다.

필드설명
팀 이름marketing부서/팀 식별자
월 예산100 GB월간 스캔 바이트 한도
알림 임계치80%예산 80% 도달 시 알림

2-2. 예산 현황 모니터링

월 예산현재 사용량사용률상태
marketing100 GB45 GB45%🟢 정상
finance200 GB178 GB89%🟡 주의
data-eng500 GB320 GB64%🟢 정상
경고

예산 초과 시 쿼리가 차단되지는 않지만, 알림이 발생하고 감사 로그에 기록됩니다.


3단계: 고비용 쿼리 식별

스캔 바이트 Top 10

비용 대시보드에서 스캔 바이트 기준으로 정렬합니다:

순위사용자쿼리 요약스캔(GB)CPU(s)시간(ms)
1data-engSELECT * FROM transactions8.212.53,200
2analystJOIN customers × transactions5.18.32,100
3adminCOUNT(*) GROUP BY ALL3.86.21,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 관리 페이지

사이드바 하단 ⚙ 관리 콘솔 → 접근 제어 & 보안 → 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) — 날짜 필터 추가 권장
...