Neutron의 쿼리 실행 방식#
Neutron은 실행이 허용된 SQL을 정확히 지정된 Iceberg 스냅샷에 대해 평가합니다. 핵심 원칙은 할당 전에 메모리 예산을 정하는 것입니다. 프로세스가 커진 뒤에야 메모리 사용량을 확인하는 방식에 의존하지 않습니다.
실행 허용 단계에서 의미를 확정합니다#
쿼리 프런트엔드는 문 하나를 파싱하고, 지원하지 않는 기능을 분류하며, 레이크 이름을 확인하고 스냅샷을 선택합니다. Neutron은 완결된 실행 계획과 범위가 제한된 테이블 접근 권한을 받습니다. 임의의 카탈로그를 연결하거나 읽기 권한을 쓰기 권한으로 바꿀 수 없습니다.
SQL 방언과 의미 체계 테이블의 버전도 식별 정보에 포함됩니다. 파싱이나 값의 의미가 바뀌면 캐시에 저장된 가정을 무효화합니다. 다른 언어 규칙으로 얻은 결과를 아무 표시 없이 재사용하지 않습니다.
메모리를 명시적으로 관리합니다#
연산자는 행, 키, 디코딩한 페이지, 디스크 임시 저장 메타데이터를 보유하기 전에 메모리를 예약합니다. 해시 집계, 조인, 정렬, 윈도 함수, 구체화에는 각각 상태 크기가 제한된 처리 경로가 있습니다. 미리 가져오는 읽기도 요청된 읽기와 동일한 예산을 사용합니다.
재시도가 가능한 쿼리가 할당된 예산을 소진하면 Supernova는 더 큰 등급으로 재시도할 수 있습니다. 재시도에서도 SQL과 선택된 스냅샷은 그대로 유지됩니다. 사용 가능한 최대 한도에 맞지 않는 쿼리는 실패합니다. 메모리 부족으로 호스트가 프로세스를 강제 종료하도록 내버려 두지 않습니다.
불필요한 읽기를 줄입니다#
카탈로그 메타데이터는 매니페스트, 파일, 행 그룹, 통계를 식별합니다. 열 가지치기는 쿼리가 사용하지 않는 열의 디코딩을 생략합니다. 조건식에 대한 근거가 있으면 데이터를 가져오기 전에 파일과 행 그룹을 제외할 수 있습니다.
메타데이터와 데이터는 크기가 제한된 별도의 캐시를 사용합니다. 큰 데이터 구간을 읽는 작업이 다음 읽기를 계획하는 데 필요한 작은 매니페스트를 캐시에서 밀어내지 않도록 하기 위해서입니다. 예약된 예산 안에서 가져오기와 디코딩을 겹쳐 수행합니다.
결정성을 구분합니다#
연산자는 SQL 방언 계약에 따라 정렬, null, 부동소수점, 타임스탬프, 십진수, JSON, 컬렉션의 동작을 정의합니다. order by가 없는 쿼리는 출력 순서를 보장하지 않습니다. 순서에 민감한 연산이 있는 쿼리는 문서에 명시된 의미 체계에 따라 일정한 결과를 반환합니다.
Neutron은 기존 엔진과 나란히 동일한 쿼리와 스냅샷을 실행할 수 있습니다. 비교 시 정확한 일치, 순서와 무관한 일치, 허용 오차에 따른 일치, 비교 불가능한 결과를 구분합니다. 성능이 좋다는 이유만으로 값의 불일치를 허용하지 않습니다.
잘못된 결과는 손상으로 취급합니다#
비정상 종료나 리소스 한도에 따른 거부는 드러나며 재시도할 수 있습니다. 그럴듯하지만 틀린 행은 알아채지 못한 채 모델이나 의사결정에 사용될 수 있어 더 위험합니다. 따라서 Neutron은 의미상 불일치를 정확성 사고로 취급합니다. 근거를 보존하고, 처음으로 결과가 달라진 연산자를 찾으며, 해당 처리 경로를 기본 서비스에서 제외합니다.
이 원칙에 따라 지원하지 않는 구문은 이름을 명시하며 실패합니다. 우연히 행을 반환하는 불완전한 구문 지원보다 정확한 거부가 안전합니다.