행 표현식 비교

행 표현식 비교 (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 BY
  • ORDER 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

더 알아보기 (Learn more)