Phoenix 에서 페이징 쿼리를 사용하기 위해서는 아래 두 가지를 방법을 이용하여 처리할 수 있다.
- Row Value Contructors (RVC)
- OFFSET 과 LIMIT (4.8 버전 이상부터 지원)
Row Value Constructors (RVC) 를 이용한 방법
OFFSET (LIMIT) 은 익숙한 개념이나 Row Value Constructors 는 좀 생소하다.
RVC 는 괄호에 묶여있는 컬럼들을 순차적으로 정렬된 새로운 값을 만들어 낸다고 보면 된다. 아래 예를 들어 보자.
1 | WHERE (last_name,first_name) = ('Jane','Doe') | cs |
last_name, first_name 을 RVC 로 정의하고, 조건으로 ‘Jane’ 과 ‘Doe’ 로 묶었다.
위 절을 다시 풀어보면 개념적으로 아래와 같다고 볼 수 있다.
1 | WHERE concat(last_name, first_name) = 'JaneDoe' | cs |
RVC 를 통해 생성된 값들의 비교 연산은 가장 왼쪽의 컬럼을 우선으로 정렬된다. 예는 아래와 같다. (아래 예는 모두 true 를 반환한다.)
1 2 3 | (9, 5, 3) > (8, 8) ('foo', 'bar') < 'g' (1,2) = (1,2) | cs |
RVC 의 위와같은 비교가능한 속성과 세트로 생선된 값이 순차적으로 정렬되는 특징을 이용하여 LIMIT 절과 함께 페이징 쿼리를 만들어 낼 수 있다.
RVC 를 이용한 페이징 쿼리는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 | SELECT title , author , isbn , description FROM library WHERE published_date > 2010 AND (title, author, isbn) > (?, ?, ?) ORDER BY title, author, isbn LIMIT 20 | cs |
title, author, isbn 로 정렬된 쿼리에 페이징 기능을 추가하기 위해 정렬 기준 컬럼들을 RVC 로 묶었다. 이 때 (?, ?, ?) 에는 이전 쿼리의 마지막 값을 바인딩 해주면 된다. 그러면 이 다음 값부터 시작하는 20개의 Row 를 조회하게 된다.
이렇게 쿼리 조회 결과의 마지막 값을 파라미터로 제공하면 순차적으로 페이지 크기 만큼 새로운 Row 들을 조회한다.
만약, 정렬 기준 컬럼들이 primary key(복합키 또는 보조 인덱스를 포함) 로 제공된다면, 시작 위치부터 스캔을 하기 때문에 효율적이다.
OFFSET과 LIMIT 을 이용한 방법
시작 row 의 위치는 OFFSET 으로, 페이지 사이즈는 LIMIT 으로 지정하여 페이징 처리를 할 수 있다.아래 예는 페이지 당 10개의 Row 를 가져오는 쿼리의 2페이지를 조회하는 쿼리이다. (시작위치 : 10, 페이지 사이즈 : 10)
Phoenix 문서에는 OFFSET 절을 먼저 쓰게 나와있지만, 테스트 결과 OFFSET절은 항상 마지막에 써주어야 정상적으로 쿼리가 수행되었습니다.
1 2 3 4 5 6 7 8 9 | SELECT title , author , isbn , description FROM library WHERE published_date > 2010 ORDER BY title, author, isbn LIMIT 10 OFFSET 10 | cs |
테스트 결과 앞쪽 페이지를 질의 할 때 실행속도가 빨랐고, 뒤 쪽 페이지로 넘어갈 수록 실행 속도가 떨어졌습니다.
100만건 데이터가 들어있는 테이블에 대한 테스트 결과 입니다.
결론
OFFSET 은 쿼리의 형태에 따라 서버 또는 클라이언트에서 row 를 읽어 스킵하는 방식으로 동작한다.
반면, RVC 는 primary key(또는 보조 인덱스를 포함하여) 컬럼들을 정렬 기준으로 사용하면 파리미터로 제공되는 key 다음 부터 읽기 작업을 수행하기 때문에 효율적이다.
참조 : https://phoenix.apache.org/paged.html
'Big Data > HBase&Phoenix' 카테고리의 다른 글
HDP 2.4 에서 phoenix 4.4 에서 4.8 버전으로 업그레이드 하기 (0) | 2016.08.22 |
---|---|
Phoenix - Joins (조인) (0) | 2016.08.17 |
Phoenix - Row timestamp (0) | 2016.08.15 |
Phoenix - Salted Tables (0) | 2016.08.12 |
Phoenix - Secondary Index (2) | 2016.08.12 |