행 표현식 비교
행 표현식 비교 (Row Expression Comparison)
Apache Pinot는 multi-stage 쿼리에서 암시적(implicit) 행 스타일(row-style) 비교를 지원해요. 이 비교는 키셋 페이지네이션(keyset pagination)이나 여러 컬럼에 걸친 사전식(lexicographic) 비교에 유용해요. 복잡한 다중 컬럼 조건을 하나의 괄호 표현식으로 표현할 수 있어서 keyset 페이지네이션 구현이 훨씬 깔끔해져요.
출처: 문서
본문
Pinot는 multi-stage 쿼리에서 암시적 행 스타일 비교를 지원해요. 이러한 비교는 키셋 페이지네이션과 여러 컬럼에 걸친 기타 사전식 비교에 유용해요.
Pinot는 런타임에 행 타입(row type)을 실체화(materialize)하지 않아요. 대신 jOOQ 행 값 비교 변환에 설명된 것과 동일한 사전식 의미론을 사용해 계획(planning) 단계에서 비교를 다시 작성해요.
지원되는 구문
지원되는 비교 연산자 중 하나를 양쪽에 괄호로 감싼 표현식 목록으로 사용해요.
WHERE (col1, col2, col3) > (val1, val2, val3)
지원되는 비교 연산자:
=, <>, <, <=, >, >=
참고: 명시적인
ROW()구문은 지원되지 않아요.ROW(col1, col2) > ROW(1, 2)대신(col1, col2) > (1, 2)와 같은 암시적 괄호 표현식을 사용해요.
검증 규칙
Pinot는 쿼리 계획 전에 행 스타일 비교를 검증해요.
- 비교의 양쪽 모두 행 표현식이어야 해요.
- 양쪽 행 표현식은 필드 수가 같아야 해요.
- 행 표현식은 비어 있을 수 없어요.
- 행 표현식은 비교 조건(predicate)에서만 지원돼요.
이 중 하나라도 실패하면 Pinot는 검증 단계에서 쿼리를 거부해요.
지원되는 컨텍스트
행 스타일 비교는 비교 조건에서 지원되며, 다음을 포함해요.
WHERE절- 서브쿼리 안의 비교 조건
- CTE 안의 비교 조건
예시:
SELECT COUNT(*)
FROM myTable
WHERE (airTime, actualElapsedTime) > (200, 230)
SELECT airlineId, carrier, airTime
FROM myTable
WHERE (airlineId, carrier, airTime) > (20000, 'AA', 120)
ORDER BY airlineId, carrier, airTime
LIMIT 10
WITH filtered AS (
SELECT airlineId, carrier, airTime
FROM myTable
WHERE airlineId > 19000
)
SELECT COUNT(*)
FROM filtered
WHERE (airlineId, carrier) > (20000, 'AA')
지원되지 않는 컨텍스트
행 표현식은 비교 조건 밖에서는 거부돼요. 특히 다음에서는 지원되지 않아요.
SELECT목록GROUP BYORDER BY- 함수 인자
Pinot가 거부하는 예시:
SELECT (airTime, actualElapsedTime) FROM myTable
SELECT COUNT(*) FROM myTable GROUP BY (airlineId, carrier)
SELECT airlineId, carrier FROM myTable ORDER BY (airlineId, carrier)
의미론
행 비교는 요소별(element-wise)이 아니라 사전식(lexicographic)이에요. 예를 들어:
WHERE (a, b, c) > (x, y, z)
는 다음과 동일해요.
WHERE a > x
OR (a = x AND b > y)
OR (a = x AND b = y AND c > z)
마찬가지로:
WHERE (a, b, c) = (x, y, z)
는 다음과 동일해요.
WHERE a = x
AND b = y
AND c = z