12.4.1.1 ORDER BY 절 부재 시 발생하는 판정 모순 해결 방법
관계 대수학(Relational Algebra)을 기반으로 정밀하게 설계된 SQL의 국제 기술 표준(ISO/IEC 9075) 명세에 따르면, ORDER BY 절이 명시적으로 동반되지 않은 모든 일반 SELECT 쿼리는 반환되는 튜플(Tuple, 행 데이터)들의 물리적인 배열 순서를 호출자에게 단 한 치도 보장하지 않는다.
이는 데이터베이스 엔진 내부에 깊숙이 이식된 쿼리 옵티마이저(Optimizer) 알고리즘이, 해당 트랜잭션 시점의 B-Tree 인덱스 단편화 상태, 메모리 버퍼 캐시(Buffer Cache) 병목, 그리고 다중 해시 조인(Multi-way Hash Join)의 처리 순서 등을 종합적으로 계산하여 가장 컴퓨팅 비용(Cost)이 저렴한 스캔 경로를 매번 무작위 동적으로 선택해 버리기 때문이다.
1. 판정 모순(False Negative)의 발생 기제와 치명성
이러한 관계형 데이터베이스의 본질적인 비결정적 특성을 간과하고 파이썬으로 단순한 1차원적 비교 검증 루프를 구축해 버릴 경우, 오라클 시스템은 엔터프라이즈 환경에서 절대로 용납될 수 없는 치명적인 판정 모순을 연쇄적으로 일으키게 된다.
예를 들어, “근속 연수가 10년 이상인 우수 직원 리스트를 모두 찾아라“라는 쿼리에 대한 채점 상황을 가정해 보자.
- 정답 쿼리 텐서 (Golden Tensor, 런타임 A):
[Alice, Bob, Charlie](프라이머리 키 오름차순으로 우연히 인출됨) - AI 예측 쿼리 텐서 (Predicted Tensor, 런타임 B):
[Bob, Charlie, Alice](최근 업데이트된 디스크 블록 스캔 방향에 따라 다르게 인출됨)
논리 집합론(Set Theory)의 관점에서, 이 두 텐서 집합은 직원의 누락이나 허위 생성 정보가 단 1비트도 섞이지 않은 100% 완벽한 의미론적 진리 집합(Semantic True Set)이다. 그러나 멍청한 오라클 판별기가 이를 단순 문자열 배열 리스트로 인식하여 인덱스 기반의 교차 매칭 루프(Gold_List[0] == Pred_List[0])를 수행해 버리는 순간, 첫 번째 반복문에서 Alice != Bob이라는 불일치 예외(Exception)가 트리거(Trigger)된다. 그 결과, 논리적으로 가장 훌륭하고 최적화된 쿼리를 기계적으로 작성해 낸 AI 모델 에이전트에게 시스템은 가차 없이 **0점(오답)**을 부여하는 부당하고도 끔찍한 오판(False Negative)을 저지르게 되는 것이다.
2. 결함 없는 수학적 정규화 로직 방어막 구축 (Sort & Diff)
이 거대한 판정 모순을 파이프라인의 입구에서 원천 차단하기 위해, 앞서 설명한 오라클 내부의 전처리 엔진인 **결과 정규화기(Result Normalizer)**는 원시 텐서들이 대법관(Comparator)에게 넘어가기 직전에 반드시 다음과 같은 2단계 강제 물리 정렬(Forced Physical Sorting) 방어막 절차를 의무적으로 관통하도록 격리 통제해야 한다.
- AST 파싱을 통한 출제자 의도 확인 (Intent Parsing): 시스템은 텐서를 쳐다보기 전, 원본 프롬프트와 정답 쿼리(
Golden SQL) 소스 코드 그 자체의 추상 구문 트리(AST, Abstract Syntax Tree)를 파싱 엔진(예: SQLGlot)으로 가동한다. 이를 통해 인간 출제자가 쿼리 작성 시ORDER BY노드(Node)를 “의도적이고 필수적으로 요구했는가“를 확인하는 논리 플래그(Flag) 변수를 검사한다. (예: “나이가 가장 많은 순서대로 10명만 정렬해 줘“라는 질문이라면 순서 자체가 정답의 필수 요건이다.) - 동적 다차원 집합 정렬 매커니즘 (Dynamic Multi-dimensional Sort): 만약 구문 분석 결과
ORDER BY트리가 아예 존재하지 않는 순수 자유 순서(Free-order) 집합 추출 문제로 확인될 경우, 판별기는 무작위로 인출된 두 텐서를 즉시 파이썬 판다스(Pandas)의 거대한DataFrame객체로 형변환(Casting)시켜 버린다. 그런 다음, 반환된 모든 컬럼(Column)의 명칭 복합 키(Composite Key) 인덱스로 지정하여 극단적인 전체 프레임 오름차순 강제 정렬(df.sort_values(by=list(df.columns)))을 무자비하게 실행시켜 순서를 깎아 분쇄한다.
결과적으로 뒤틀려 있던 두 집합은 [Alice, Bob, Charlie]라는 완전히 동일한 메모리 배열 시퀀스로 수학적 형재 변환 및 재조립이 이루어진다. 그 이후에야 최종 대법관은 이 텐서들을 향해 1비트 매핑 비교 연산을 허가하며, AI는 비로소 자신이 작성한 위대한 논리에 상응하는 정당한 1점(True)을 거머쥐게 된다. 이 복잡하고 숨 막히는 정규화 알고리즘 단계를 단 하나라도 생략한 채 점수를 매기는 어떠한 NL2SQL 벤치마크도, 거대한 엔터프라이즈 환경에서는 한낱 휴지조각에 불과한 쓰레기 통계 지표일 뿐이다.