Big Data/HBase&Phoenix

Phoenix - Paged Queries (페이징 쿼리)

신씅 2016. 8. 14. 22:31
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
(953> (88)
('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