피드로 돌아가기
When a KPI reads 163 billion instead of 819
Dev.toDev.to
Database

쿼리 경로 불일치로 인한 819 → 1630억 KPI 오차 해결

When a KPI reads 163 billion instead of 819

Nasrul Hazim Bin Mohamad2026년 6월 30일3intermediate

Context

대규모 데이터셋을 위한 SQL Push-down 경로와 소규모 데이터셋을 위한 In-memory Aggregator라는 두 가지 쿼리 처리 경로를 운용하는 구조. 동일한 결과값을 반환해야 하는 두 경로 간의 로직 불일치로 인해 데이터 정합성 문제 발생.

Technical Solution

  • SQL Compiler의 파라미터 바인딩 단계에서 값은 할당했으나 실제 WHERE 절에 Predicate를 누락한 설계 결함 식별
  • 단일 Metric Series 환경에서는 우연히 정상 작동하였으나, 다중 Series 환경에서 모든 데이터가 합산되는 사이드 이펙트 발생
  • 개별 경로의 패치가 아닌 basePredicates()라는 공통 추상화 계층을 도입하여 모든 컴파일 경로가 동일한 WHERE 조건을 상속받는 구조로 변경
  • Push-down과 In-memory 두 경로 모두 metric_key 필터가 반드시 포함됨을 검증하는 통합 회귀 테스트 구축
  • 파라미터 바인딩과 실제 Predicate 참조를 분리하여 생각하는 설계 관점 적용

1. 동일 결과물을 내는 다중 쿼리 경로 존재 여부 확인

2. 공통 필터 조건의 중복 정의를 피하기 위한 Shared Predicate 계층 설계 검토

3. 데이터셋 규모에 따른 분기 로직 처리 시 각 경로의 SQL 생성 결과물을 비교 검증하는 테스트 코드 작성

원문 읽기