- Published on
Parquet의 min/max 통계는 쿼리 엔진이 데이터를 건너뛰게 해 주는 장치입니다. 그런데 부동소수점 컬럼에서는 이 장치가 10년 넘게 미묘하게 고장 나 있었습니다 — NaN은 어떤 비교에서도 false를 내므로 통계에서 배제되는데, 그러면 NaN이 든 페이지가 max보다 큰 값을 찾는 쿼리에서 통째로 스킵될 수 있습니다. 성능 문제가 아니라 결과가 틀리는 문제입니다. 2026년 6월 13일 릴리스된 parquet-format 2.13.0은 여기에 nan_count 필드와 IEEE_754_TOTAL_ORDER라는 새 컬럼 순서를 넣어 이 구멍을 막았습니다. 2023년 2월에 올라온 PARQUET-2249부터 두 번의 무산된 PR을 거쳐 3년 3개월 만입니다. 이 글은 왜 float 통계만 유독 어려운지, DataFusion에서 지금도 재현되는 실제 오답, 2.13.0이 스펙에서 정확히 무엇을 바꿨는지, 그리고 정직한 현재 상태 — parquet-java는 머지됐지만 릴리스 전이고, Arrow C++는 thrift만 동기화했고, arrow-rs는 아직 draft PR — 를 정리합니다. 그리고 이 수정이 공짜가 아니라는 점, 즉 옵트인이고 프루닝이 오히려 보수적으로 바뀐다는 비용까지 함께 다룹니다.