SQL++/N1QL 쿼리

Couchbase를 사용한 페이지 매김 모범 사례

[이 블로그는 https://blog.grallandco.com]에서 신디케이트되었습니다.

Couchbase 클러스터에 대해 쿼리를 수행할 때 많은 수의 문서를 처리해야 하는 경우 페이지 매김을 사용하여 페이지별로 행을 가져오는 것이 중요합니다. 문서에서 "페이지 매김'라는 질문이 있지만, 이 글에서 더 자세한 내용과 샘플 코드를 살펴보고자 합니다.
이 페이지 매김 예제에서는 다음과 같은 간단한 보기를 만드는 것으로 시작하겠습니다. 맥주 샘플 데이터 집합을 사용하여 국가별 양조장을 찾는 데 뷰를 사용합니다:

함수 (문서, 메타) {
if (doc.type == "brewery" && doc.country){
emit(doc.country);
}
}

 

이 보기에는 국가별로 모든 양조장이 나열되며 색인은 다음과 같습니다:

문서 ID 가치
bersaglier 아르헨티나 null
cervecera_jerome 아르헨티나 null
브로우리_나시오날_발라시 아루바 null
호주_브루잉_법인 호주 null
칼튼 앤 유나이티드 브루어리 호주 null
쿠퍼스_브루어리 호주 null
foster_s_australia_ltd 호주 null
골드코스트_브루어리 호주 null
라이온_나단_호주_헌터_거리 호주 null
little_creatures_brewery 호주 null
몰트_삽_양조장 호주 null
마틸다_베이_브루잉 호주 null
옐로우스톤_밸리_브루잉 미국 null
유잉링_손_브루잉 미국 null
제아_로티세리_앤_브루어리 미국 null
fosters_tien_gang 베트남 null
hue_brewery 베트남 null

이제 페이지 크기가 5행인 이 색인에서 탐색하려고 합니다.

건너뛰기/제한 매개변수 사용

가장 간단한 접근 방식은 limit 그리고 건너뛰기 매개변수를 예로 들 수 있습니다:

1 페이지 :  ?limit=5&skip0
2페이지:   .limit=5&skip=5

페이지 x:   ?limit=5&skip(limit*(page-1))

범위 또는 키 쿼리를 수행하는 데 필요한 다른 매개 변수를 사용할 수 있습니다(시작키/종료키, 키, 키) 및 정렬 옵션(내림차순).

이 방법은 간단하지만 쿼리 엔진이 건너뛰기 값에 도달할 때까지 쿼리와 일치하는 모든 행을 읽어야 하므로 가장 효율적인 방법은 아닙니다.

이 보기를 사용하여 페이지 매김하는 파이썬의 일부 코드 샘플 :

이 애플리케이션은 색인이 끝날 때까지 모든 페이지를 반복합니다.

앞서 말했듯이 이것은 건너뛰기에 도달할 때까지 시스템이 모든 값을 읽어야 하므로 페이지 매김 모범 사례를 나타내지 않습니다. 다음 예제는 이 문제를 처리하는 더 나은 방법을 보여줍니다.

startkey / startkey_docid 매개변수 사용

이 페이지 매김을 보다 효율적으로 만들기 위해 다른 접근 방식을 사용할 수 있습니다. 이 접근 방식은 시작키 그리고 startkey_docid  를 클릭하여 적절한 문서를 선택합니다.
  • 그리고 시작키 매개변수는 쿼리가 읽기를 시작해야 하는 키의 값입니다("이전 페이지"의 마지막 키 기준).
  • 예를 들어 "독일"과 같은 키의 경우 하나 이상의 ID(문서)가 있을 수 있으므로 Couchbase 쿼리 엔진에 시작할 위치를 알려야 하므로 이를 위해 다음을 사용해야 합니다. startkey_docid 매개변수를 설정하고, 이 ID는 이전 페이지의 마지막 항목이므로 무시합니다.
따라서 인덱스를 보고 페이지 매김을 설명하기 위해 행 번호를 추가하면 다음과 같습니다.
행 번호 문서 ID 가치
1 페이지에 대한 쿼리 : ?limit=5
1 bersaglier 아르헨티나 null
2 cervecera_jerome 아르헨티나 null
3 브로우리_나시오날_발라시 아루바 null
4 호주_브루잉_법인 호주 null
5 칼튼 앤 유나이티드 브루어리 호주 null
2페이지에 대한 쿼리: ?limit=5&startkey="Australia"&startkey_docid=carlton_and_united_breweries&skip=1
6 쿠퍼스_브루어리 호주 null
7 foster_s_australia_ltd 호주 null
8 골드코스트_브루어리 호주 null
9 라이온_나단_호주_헌터_거리 호주 null
10 little_creatures_brewery 호주 null
3 페이지에 대한 쿼리 : limit=5&startkey="Australia"&startkey_docid=little_creatures_brewery&skip=1
11 몰트_삽_양조장 호주 null
12 마틸다_베이_브루잉 호주 null
옐로우스톤_밸리_브루잉 미국 null
유잉링_손_브루잉 미국 null
제아_로티세리_앤_브루어리 미국 null
fosters_tien_gang 베트남 null
hue_brewery 베트남 null

따라서 위의 예제에서 볼 수 있듯이 쿼리는 시작 키, 문서 ID를 사용하고 skip=1을 사용하여 전달합니다.

이제 다시 한 번 Python으로 애플리케이션 코드를 살펴보겠습니다.

 

이 애플리케이션은 인덱스가 끝날 때까지 모든 페이지에서 반복됩니다.
이 접근 방식을 사용하면 애플리케이션이 특정 키에서 인덱스를 읽기 시작합니다(시작키 매개변수)를 사용하여 인덱스에서 필요한 항목만 반복합니다. 이는 단순 건너뛰기 방식을 사용하는 것보다 더 효율적입니다.

 

축소 기능이 있는 뷰

뷰에서 축소 기능을 사용하는 경우 다양한 키에서만 페이지 매김을 하려면(축소 기능 사용) 다음을 수행해야 합니다. 를 사용하여 건너뛰기 그리고 limit 매개변수.
사용 중인 경우  매개변수 startkey_docid 축소 함수를 사용하면 쿼리의 일부인 문서 ID의 하위 집합에 대해서만 축소를 계산합니다.

카우치베이스 자바 SDK 페이지네이터

이전 예제에서는 다양한 쿼리 매개변수를 사용하여 페이지 매김을 수행하는 방법을 보여드렸습니다. Java SDK는 개발자가 페이지 매김을 처리하는 데 도움이 되는 페이지 매김 객체를 제공합니다. 다음 예제에서는 페이지 매기기 API를 사용하여 동일한 보기를 사용합니다.

보시다시피 Java 페이지 매기기를 사용하여 쿼리 결과를 쉽게 페이지 매길 수 있습니다.

  • #37 줄에서 뷰 및 쿼리 개체를 사용하여 페이지 매김이 생성되고 페이지 크기가 지정됩니다.
  • 그런 다음 hasNext() 및 next() 메서드를 사용하여 결과를 탐색하기만 하면 됩니다.

Java 페이지네이터는 쿼리가 reduce를 사용하고 있는지 여부를 인식하므로 모든 유형의 쿼리에 사용할 수 있으며, 내부적으로 건너뛰기/제한 접근 방식과 doc_id 접근 방식 간에 전환합니다. 다음을 수행할 수 있습니다. 페이지 매기기 클래스에서 어떻게 수행되는지 확인하세요..

HTTP 요청 사이에 웹 애플리케이션에서 이 작업을 수행하려면 현재 API가 현재 페이지를 해당 상태로 유지하므로 사용자 세션에서 페이지 매기기 객체를 유지해야 합니다.

결론

이 블로그 게시물에서는 Couchbase 보기에서 페이지 매김을 처리하는 방법을 배웠습니다. 요약하면 다음과 같습니다.

  • 페이지 매김은 쿼리를 실행할 때 전송하는 몇 가지 특정 매개변수를 기반으로 합니다.
  • Java 개발자는 페이지 매김을 간소화하는 Paginator 클래스를 사용할 수 있습니다.
아직 개발 중인 새로운 카우치베이스 쿼리 언어 N1QL을 살펴보고 개발자에게 더 많은 페이지 매김 옵션(예: LIMIT & OFFSET 매개변수 사용)을 제공하도록 초대합니다:
SELECT 이름, 나이
튜토리얼에서
연령이 30세 이상인 경우
제한 2
오프셋 2

N1QL에 대해 자세히 알아보려면 다음을 참조하세요:

추신: 10월 8일에 페이지 매김 줄이기 기능을 명확히 하기 위해 수정되었습니다.
이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

Author

Posted by Jennifer Garcia

의 선임 웹 관리자입니다. 웹 사이트 관리자로서 디자인, 구현, 콘텐츠 및 성능을 포함한 웹 사이트 자산에 대한 전반적인 책임을 맡고 있습니다.

댓글 하나

  1. 유용한 정보가 많네요!

  2. 페이지에 대해 (그리고 문서에서 언급된) 한 가지 알아차린 점은 X 페이지를 검색하는 데 걸리는 시간이 0에서 X까지의 거리에 비례한다는 것입니다. 예를 들어 100,000개의 행이 있고 페이지가 각각 1,000개(100페이지)인 경우 100페이지를 검색하면 100,000개 전체를 검색하는 것과 같은 시간이 걸립니다. 작업의 단순성을 위해 비교적 정교한 해결 방법이 언급되어 있는데, 이는 기본적으로 보기 페이지 로직에 베이크인할 수 있는 기능일까요?

  3. 뷰 쿼리 키(=startKey)가 서로 고유하다면 startkey_docid를 사용할 필요가 없다고 생각합니다. 제 말이 맞나요?
    그리고 더... startkey_docid는 뷰 쿼리 키와 독립적이므로 정렬된 뷰 쿼리 인덱스에서 start_key_docid로 시작점을 찾는 데 약간의 비용이 소요될 수 있습니다 - 시작점부터 docid를 만날 때까지 스캔해야 합니다.

  4. 안녕하세요, 페이지 매김 기능이 있는 총페이지를 얻으려면 어떻게 해야 하나요?

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.