튜플(Tuple)은 데이터베이스에서 하나의 행(Row) 또는 여러 컬럼의 묶음을 의미합니다.
튜플 비교는 여러 개의 컬럼 값을 하나의 단위로 묶어서, 다른 값의 묶음과 한 번에 비교하는 문법입니다.
가장 기본적인 형태는 다음과 같습니다.
-- 기존 방식
WHERE col1 = 10 AND col2 = 20
-- 튜플 비교 방식
WHERE (col1, col2) = (10, 20)
위와 같이 (와 )로 컬럼들을 묶어 하나의 세트처럼 비교할 수 있습니다. 동등 비교(=)에서는 기존 방식과 큰 차이가 없어 보이지만, 부등호(>, <)를 사용할 때 튜플 비교의 진가가 발휘됩니다.
튜플 비교에서 > 나 < 같은 부등호를 사용할 때, 데이터베이스는 왼쪽 컬럼부터 오른쪽 컬럼 순서대로(Lexicographical order, 사전식 순서) 값을 평가합니다.
가장 헷갈리기 쉬운 (A, B) > (C, D) 의 동작 원리를 풀어서 설명해 보겠습니다.
(A, B) > (C, D) 의 논리적 의미이 조건은 다음의 복합 조건과 완전히 동일하게 동작합니다.
WHERE A > C
OR (A = C AND B > D)
해석하자면:
A와 C를 비교합니다. A가 C보다 크면, 두 번째 값(B, D)은 볼 필요도 없이 조건이 참(True)이 됩니다.A와 C가 같다면, 그제야 두 번째 값인 B와 D를 비교하여 B가 D보다 큰지 확인합니다.이러한 원리는 3개 이상의 컬럼을 묶을 때도 동일하게 확장됩니다.
(A, B, C) > (X, Y, Z)A > X OR (A = X AND B > Y) OR (A = X AND B = Y AND C > Z)튜플 비교가 실무에서 가장 빛을 발하는 순간은 커서 기반 페이지네이션(Cursor-based Pagination)을 구현할 때입니다.
예를 들어, 게시판에서 "조회수(view_count)가 높은 순, 조회수가 같다면 최신 글(id) 순"으로 정렬된 데이터를 페이징 처리한다고 가정해 보겠습니다.
이전 페이지의 마지막 게시글 정보가 조회수: 100, ID: 50 이었다면, 다음 페이지를 조회하기 위해 어떻게 쿼리를 짜야 할까요?
SELECT *
FROM board
WHERE view_count < 100
OR (view_count = 100 AND id < 50)
ORDER BY view_count DESC, id DESC
LIMIT 10;
조건이 길어지고, 괄호가 들어가면서 쿼리를 한눈에 파악하기 어렵습니다. 만약 정렬 조건이 3개로 늘어난다면 WHERE 절은 훨씬 더 복잡해집니다.
SELECT *
FROM board
WHERE (view_count, id) < (100, 50)
ORDER BY view_count DESC, id DESC
LIMIT 10;
쿼리가 놀랍도록 간결해졌습니다! (view_count, id)를 하나의 커서(Cursor) 튜플로 취급하여, 이전 커서보다 '작은' 데이터들을 가져오라는 의미가 직관적으로 전달됩니다.
튜플 비교를 사용한다고 해서 성능이 떨어지지는 않습니다. 오히려 복합 인덱스(Composite Index)가 적절히 구성되어 있다면 매우 효율적으로 동작합니다.
위의 게시판 예시에서 (view_count, id) 로 복합 인덱스가 걸려있다면, 데이터베이스의 옵티마이저는 튜플 비교 조건을 보고 인덱스를 순차적으로(Range Scan) 잘 타게 됩니다. 기존의 OR 조건보다 실행 계획을 최적화하기 더 유리한 경우가 많습니다.
주의사항: 다만, 데이터베이스 제품이나 버전에 따라
IN절 내에서 튜플 비교를 사용하거나, 특정 복잡한 조건이 섞일 경우 인덱스를 제대로 타지 못하는 엣지 케이스가 있을 수 있으므로 실행 계획(Explain Plan)을 확인하는 습관을 들이는 것이 좋습니다.
튜플 비교는 SQL-92 표준에 정의된 문법이므로, 현대의 대부분의 RDBMS에서 지원합니다.
단, SQL Server(MSSQL)의 경우 버전에 따라 튜플 비교 문법 지원이 제한적이거나 불완전할 수 있으므로, MSSQL 환경이라면 기존의 AND/OR 방식을 사용해야 할 수도 있습니다.
(A, B) 형태로 묶어 비교하는 SQL 표준 문법이다.>, <) 비교 시 사전식 순서(Lexicographical order)로 논리가 전개된다.AND/OR 조건을 깔끔하게 대체할 수 있다.복잡한 다중 정렬 조건으로 인해 쿼리가 지저분해져서 고민이었다면, 지금 바로 튜플 비교를 도입해 보세요!