분석 쿼리 최적화
1) 최적화 이유 (iGaming 컨텍스트)
비즈니스 속도: GGR/NET 보고서, 제공자/게임, RG/AML 및 p95 SLA 마케팅.
비용: 덜 스캔 된 바이트 및 shafl → $/요청 미만.
신뢰성: 안정적인 피크 시간, BI가 동결되지 않습니다.
규모: 수십 개의 브랜드/마켓, 수십억 개의 라인, 몇 분의 신선도.
2) 로드 프로파일 및 SLO
요청의 "처음 90%" 를 설명하십시오: 창 (7/28/90d), 필터 ('브랜드, 국가, 공급자, psp, 상태'), 가입, JSON 속성, 상위 K 및 백분위 수.
SLO 예: p95 지정 1. 대시 보드의 경우 2 초, 스캔 된 바이트
3) 계획의 해부학: 찾아야 할 것
예측/투영 푸시 다운-필터 및 열 목록이 소스에 생략되었습니다.
파티션 가지 치기 및 데이터 건너 뛰기 (최소 최대/블룸/매니페스트).
벡터화 된 스캔/후기 구체화: JOIN/PROJECT에 의해 지연된 열 판독.
전략 참여: Broadcast Hash (BHJ), Sort-Merge (SMJ), Nested Loop (NLJ-и
유출 및 셔플: 디스크에 셔플 및 유출되는 양은 SLA의 주요 적입니다.
적응 형 쿼리 실행: 런타임 전략 변경 (BHJ SL SMJ 스위칭, 동적 coales).
계획은 우리가 읽은 바이트 수, shaflim 위치, 캐시 한 바이트 수를 보여줍니다.
4) 당사자, 정렬, 클러스터 사례
당사자: '날짜' + 1-2 액세스 치수 (예: '브랜드, 국가').
정렬/클러스터링: 빈번한 필터/조인 ('제공자, 게임 _ id, 발생 _ at') 에 의한 'ORDER Ł/CLUSTER Ł/Z-order'.
재 분류 및 압축: 데이터 건너 뛰기를위한 정기적 인 전송; 대상 파일 크기는 128-1024 MB입니다.
5) JOIN 패턴
방송 해시 조인 (BHJ): 작은 차원 (수백 MB) → 사실로 방송됩니다.
sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...
SMJ (Sort-Merge Join): 큰 세트, 호환되는 키 정렬/클러스터 케이스 → 최소 샤프트.
사전 결합/비정규화: 안정적인 속성을 'dim _' 에서 실제 스냅 샷 (투영/실제보기) 으로 이동-임계 경로에서 JOIN을 빼십시오.
반/반 가입: 'NOT IN/EXISTS' 를 명시 적 반/반 가입 계획으로 다시 작성하십시오.
기본 폭발의 제거: 치수의 중복 키를 확인하고 대리 키를 사용하십시오.
6) 그룹으로, 집계 및 집계
롤업/큐브/그룹화 세트: 여러 집계 대신 한 단계.
sql
SELECT brand, country, DATE(ts) d, SUM(amount)
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
GROUP BY GROUPING SETS ((brand,country,d),(brand,d),(d));
재료보기 (MV )/프로젝션: 'payment _ 7d _ by _ brand _ psp', 'rounds _ 1d _ by _ provider _ game'.
부분 → 최종 집계: 엔진이 작업자 (로컬) 와 코디네이터에 부분적으로 집계 될 수 있습니다.
대략적으로: 'COUNT (DISTINT 사용자)' 용 HLL, 백분위 수 용 TDigest-BI에 여러 번 저렴하고 충분합니다.
7) 창 기능 (깔끔한)
선택성이 높은 키를 정확하게 사용하십시오. 열을 정렬하여 주문하십시오.
무거운 창을 사전 집계로 교체하고 가능한 경우 세미 조인을 교체하십시오
sql
-- Instead of window distinct
SELECT brand, COUNT() users
FROM (SELECT DISTINCT brand, user_id FROM gold. sessions WHERE d>=CURRENT_DATE-7) t
GROUP BY brand;
8) 필터, 페이지 및 TOP-K
CBO에서는 필터 순서가 중요하지 않지만 선택성 및 색인/정렬은 다음과 같습니다.
LIMIT... TIES/APPROX TOP-K를 사용하면 스캔이 단축됩니다.
Pagination: 큰 테이블의 경우 'OFFSET/LIMIT' 대신 '키셋 페이지 매김'.
sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;
9) JSON/반 구조
열로 뜨거운 경로를 재료화하십시오 ('장치. os ',' psp. 방법 ').
엔진이 지원되는 경우 JSON 경로에서 역/GIN 인덱스를 사용하십시오.
한 줄씩 UDF를 피하십시오: 강조 표시된 속성으로 더 나은 투영.
10) 약 및 샘플링
HLL/Theta Sketch: 저렴한 'COUNT DISTINGT'.
TDigest/KLL: 전체 정렬없이 백분위 수 p95/p99.
저수지/계층화 샘플링: 대화식 연구 및 미리보기.
11) 기억, 해협 및 화폐
유출 방지: 가입/agg에 대한 메모리 제한; 유출 될 때-배치/병렬 처리를 줄이고 키별로 정렬을 증가시킵니다.
동시성 및 QoS: "핫" 대시 보드 및 무거운 지옥을위한 수영장; 스캔/시간 제한; "잊혀진" 요청으로 킬 전환.
결과 캐시/쿼리 캐시: 신선도 토큰으로 비활성화하여 반복 가능한 BI 템플릿을 사용할 수 있습니다.
12) 회귀 테스트 및 "이중 실행"
상위 N 쿼리에 대한 참조 프로필 (계획/스캔 바이트/시간) 을 저장합니다.
인덱스/클러스터를 해제하기 전에-A/B 실행: p95, 스캔 바이트, 건너 뛰기, 셔플 비교.
"실패" 임계 값을 생성하십시오: p95가 상승하면> X% - 롤백.
13) 관찰 및 SLO
SLI:- p50/p95/p99 대기 시간, 스캔 된 바이트/쿼리, 바이트% 를 건너 뛰고 파일을 만졌습니다.
- 셔플 바이트, 쏟아진 바이트, 피크 메모리;
- 캐시 적중률; 정확도 접근 집계.
경고: 스캔 된 바이트의 상승, 건너 뛰는 점유율 하락, 빈번한 NLJ, 유출> 임계 값.
14) iGaming 케이스 (레시피)
14. 1 개의 지불/PSP: "면제 피크"
장소: '지금 () -7d AND ()', '브랜드, 국가, psp, 상태'.
파티: 일; 주문/Z- 주문: '(브랜드, 국가, ts)'; 비트 맵: 'psp, 상태'; 꽃: 'trange _ id'.
MV: 'payment _ 7d _ by _ brand _ psp (상태)'.
결과: p95 → ~ 1 초, 스캔 된 바이트 ° 5-10 ×, 제로 해협.
14. 2 게임 라운드: Top K Games/Hour
주문 확인/클러스터 함수 '(공급자, game _ id, rused _ at)'; 사전 집계에 대한 투영.
p95 라운드 지속 시간 동안 약 Top-K + TDigest.
결론: 핫 캐시의 2 초 미만 그래프.
14. 3 RG/AML 능동 한계
JSON 'reason' → 열; 비트 맵 'rg _ state', 'kyc _ level'; 마지막 상태와 반 조인.
결과: 전체 스캔없이 "30 일 동안" 보고하십시오.
15) 최적화 체크리스트 (일일)
1. 상위 N 요청 및 해당 프로필 수집 (계획/바이트/shafl).
2. 날짜 별 배치 + 합의 된 정렬/클러스터 사례.
3. 푸시 다운 및 투영 가지 치기 확인 (필요한 열 만).
4. JOIN 전략: 소규모 방송, SMJ 용 정렬, NLJ 없음.
5. 핫 대시 보드 용 사전 집계/MV.
6. 유효한 경우 (별도/백분위 수/탑 -k).
7. JSON → 열 및/또는 역 인덱스.
8. 압축/재 분류; 바이트 목표를 70% 이상 건너 뛰었습니다.
9. 결과 캐시 및 별도의 concarrency 풀.
10. 모니터링: p95, 스캔 바이트, 셔플, 유출, 적중률.
16) 템플릿 (사용할 준비)
16. 1 최적화 정책 (YAML)
yaml workload: bi_hot slo:
p95_latency_ms: 1200 scanned_bytes_max_mb: 256 skipped_bytes_share_min: 0. 70 storage:
partition_by: ["date"]
cluster_by: ["brand","country","occurred_at"]
indexes:
bloom: ["transaction_id","user_surrogate_id"]
bitmap: ["psp","status","rg_state"]
aggregation:
mv:
- name: mv_payments_7d_brand_psp window: "7d"
group_by: ["brand","psp","status"]
approx:
count_distinct: "hll"
percentile: "tdigest"
concurrency:
pools: {bi_hot: 50, adhoc: 10}
timeout_s: 120
16. 2 쿼리 회귀 테스트 (pseudo-SQL)
sql
-- baseline: p95<=1200ms, scanned_bytes<=256MB
EXPLAIN ANALYZE
SELECT brand, psp, status, COUNT() cnt, SUM(amount) amt
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
AND brand =:brand AND country =:country
GROUP BY brand, psp, status;
16. 3 다시 쓰기
sql
-- Bad: Heavy COUNT (DISTINCT user_id)
SELECT COUNT(DISTINCT user_id) FROM gold. sessions WHERE d>=CURRENT_DATE-7;
-- Better: HLL sketch/preaggregate
SELECT hll_union(user_hll) FROM agg. sessions_7d_user_hll WHERE d>=CURRENT_DATE-7;
16. 4 키셋 페이지 매김
sql
SELECT
FROM gold. game_rounds
WHERE (occurred_at, round_id) > (:ts,:rid)
AND brand=:brand AND country=:country
ORDER BY occurred_at, round_id
LIMIT 1000;
17) 반 패턴
'SELECT' in prod; 투영 가지 치기 부족.
수백만 줄의 OFFSET 페이지 매김.
스케치없이 카운트 디스트립; 전체 종류를 통한 백분위 수.
큰 세트의 NLJ; JSON 표현식으로 참여하십시오.
작은 배치 및 흩어진 파일 (메타 데이터 폭풍).
열을 구체화하는 대신 WHERE의 UDF 문자열.
통계/ANALYZE-블라인드 최적화 및 전체 스캔을 무시하십시오.
회귀 테스트가없고 롤백 임계 값이 없습니다.
18) 구현 로드맵
0-30 일 (MVP)
1. 상위 N 요청 측정 및 SLO/SLI 설치.
2. 날짜 별 배치 + 정렬/클러스터 케이스; 데이터를 건너 뛰거나 피울 수 있습니다
3. 핫 결제 보고서 당 하나의 MV; HLL/TDigest 술어 BI.
4. 쿼리 풀을 나누고 결과 캐시를 활성화하십시오.
30-90 일
1. 무거운 창문 인구 조사/JSON → 사전 집계/열.
2. 방송 조인 작은 치수; 대규모 SMJ; NLJ 제거.
3. 스케줄 압축 및 재 분류; 주요 고문.
4. 관찰 및 저하 경고, A/B 계획, 자동 롤백.
3-6 개월
1. 버전 지정 및 SLA가 포함 된 프로젝션/MV 카탈로그.
2. 모든 대시 보드에서 고유 한/백분위 수/탑 -k에 대한 약 커널.
3. 회귀 테스트 및 예산 $/요청을위한 균일 한 템플릿.
4. JSON 및 UDF 영구 위생: 물질화 및 지수.
19) RACI
데이터 플랫폼 (R): 파티션/클러스터링/압축, MV/프로젝션, 캐시, 모니터링.
분석/BI (R): SQL 재 작성, 약 집계, 회귀 테스트.
도메인 소유자 (C): 섹션 및 정확도에 대한 요구 사항.
보안/DPO (A/R): 개인 정보 보호/PII, 골재 익명 성.
SRE/관찰 가능성 (C): SLO/경보, concarrency 및 용량.
재무 (C): $/요청 및 경제적 효과에 대한 예산.
20) 관련 섹션
분석 스토리지 인덱싱, 데이터 스키마 및 진화, 데이터 유효성 검사, 데이터 클러스터링, 데이터 클러스터링, 치수 감소, 분석 및 메트릭 API, MLops: 모델 탐색.
합계
쿼리 최적화는 "매직 힌트" 가 아니라 시스템: 유능한 데이터 마크 업 (파티션/클러스터), 사전 집계 및 근사 알고리즘, 올바른 JOIN 전략, 캐시/컨카 렌시 및 p95 및 스캔 바이트의 지속적인 모니터링. iGaming의 경우 이는 SLA 및 예산 내에서 지불, 게임 및 규정 준수를위한 빠르고 안정적인 지표를 의미합니다.