배열 인덱스 커버링 등으로 배열을 최대한 활용하기...

만세!! 방금 출시했습니다. 카우치베이스 서버 4.5 는 멋진 기능과 개선 사항으로 가득 찬 가방을 제공합니다. 이전 게시물 배열 인덱싱으로 배열을 최대한 활용하기... 에서 배열 인덱싱 기능을 소개했습니다. 이 블로그 게시물에는 배열 인덱스, UNNEST, ALL, ANY 및 EVERY 등과 같은 더 많은 연산자 지원 등에 대한 내용이 포함되어 있습니다,

배열 인덱스 커버링

 커버링 인덱스 는 N1QL의 성능 기능으로, 문서를 가져오기 위해 데이터 서비스로 이동하는 것을 방지하여 쿼리 성능을 크게 향상시킵니다. 커버링 인덱스를 생성/사용하기 위한 특별한 구문은 없습니다. 이것은 쿼리가 인덱스 자체에서 필요한 모든 데이터를 찾을 수 있을 때 N1QL에서 트리거되는 자동 최적화입니다. 따라서 커버 인덱스는 그냥 일반적인 GSI입니다. 쿼리에 필요한 데이터를 포함하는 모든 인덱스 키로 생성되는 인덱스입니다.

일반적으로 배열 인덱스는 배열 내의 필수 요소/속성을 인덱스 키로 사용하여 생성됩니다. 그리고 커버링 인덱스는 특별한 주의가 필요하지 않습니다. 하지만, 를 사용하여 커버링 배열 인덱스를 생성하려면 배열 자체도 를 CREATE INDEX 문에 제공된 다른 인덱스 키 목록에 추가합니다. N1QL이 쿼리에서 술어를 올바르게 평가하려면 배열의 모든 세부 정보가 필요합니다.  예를 들어, 다음 명령은 'schedule[].flight' 카우치베이스의 'travel-sample' 데이터 세트:

배열 필드 'schedule' 자체도 추가 인덱스 키로 지정해야 합니다. 이와 대조적으로 비커버링 배열 인덱스는 이를 필요로 하지 않으며 다음과 같이 생성됩니다:

다음 SELECT 문은 커버링 배열 인덱스를 사용하는 방법을 보여줍니다. 이 문은 다음을 찾습니다. "일주일에 정기 항공편이 10편 미만인 유나이티드항공 항공편 노선의 스케줄".

SELECT는 다음 하위 섹션에서 설명하는 인덱스 선택 규칙을 따릅니다.

  • where절의 술어(array_length(schedule) < 10) 및 (유형 = "경로") 색인 정의에 있는 것과 일치합니다.
  • 인덱스 키 i.flight 그리고 일정 를 참조할 때 정확한 변수  'i' 인덱스 정의에 사용
  • 쿼리 계획 설명에는 배열 인덱스 ''에 포함된 속성과 필터/술어가 표시됩니다.isched_covered'

성능

커버드 배열 인덱스는 인덱스를 활용할 수 있는 쿼리에 대해 최상의 성능을 제공합니다. 예를 들어  위의 쿼리는 8ms가 걸렸습니다. 내 노트북에서, 커버된 배열 인덱스 'isched_covered'. 그러나 인덱스 'def_type' 검색에 3초가 걸렸습니다. 이는 미친 375x 더 나은 성능 를 입력합니다.

인덱스 선택 규칙

사용된 연산자에 관계없이 DML은 배열 인덱스를 사용하기 위해 인덱스 선택 요구 사항을 따라야 합니다.

  1. 그리고 WHERE-절 를 SELECT 또는 기타 DML 문에 사용해야 하며, CREATE INDEX 정의에 일치하는 인덱스 키가 지정되어 있어야 합니다.
  2. 부분 인덱스의 경우, 인덱스 생성 정의에 사용된 술어는 반드시 WHERE-절 를 입력합니다.
  3. 변수 이름의 WHERE-절 는 CREATE INDEX 정의에 사용된 해당 변수 이름과 정확히 일치해야 합니다.

여러 개의 일치하는 인덱스를 사용할 수 있는 경우, N1QL은 쿼리를 실행하기 위해 일치하는 인덱스 중 하나를 선택할 수 있습니다. 쿼리에서 특정 인덱스를 활용하기를 원하는 경우 DML에 USE INDEX 절을 사용하여 인덱스를 '제안'할 수 있습니다.

더 많은 N1QL 운영자 지원

운영자를 위한 지원이 추가된 Couchbase 4.5 UNNEST 그리고 누구에게나 를 사용하여 배열 인덱스로 작업할 수 있습니다. 이러한 연산자는 커버된 배열 인덱스와 커버되지 않은 배열 인덱스가 모두 포함된 쿼리에서 사용할 수 있습니다. 참고하세요:

  • ANY 연산자는 이미 지원됩니다.를 개발자 프리뷰 릴리스에 추가합니다. 위의 예를 참조하세요.
  • 모든 연산자는 Couchbase 4.5에서 지원되지 않습니다. 그러나 ANY AND EVERY 연산자는 지원됩니다. 명확하게 설명하자면, EVERY 연산자는 요소가 0인 배열에 대해 참으로 평가되는 반면, ANY AND EVERY 연산자는 배열에 일치하는 요소가 하나 이상 있는 경우 참으로 평가됩니다.

배열 인덱스와 함께 UNNEST 사용

배열 인덱싱은 UNNEST 연산자를 사용하여 인덱스가 생성되는 배열 속성을 평탄화하여 쿼리의 일부로 사용할 수 있습니다. UNNEST 문은 정확히 동일한 변수 이름(예: ''), 이 예에서는 CREATE INDEX 문에 사용됩니다. 예를 들어, 다음 쿼리는 일주일에 정기 항공편이 10편 미만인 유나이티드항공 항공편 노선의 세부 정보.

성능

적용 대상 배열 인덱스는 인덱스를 활용할 수 있는 쿼리에 대해 최상의 성능을 제공합니다. 예를 들어  위의 쿼리에는 8ms 내 노트북에서, 커버를 사용할 때 배열 인덱스 'isched_covered. 그러나 인덱스 'def_type' 28개 소요초. 그건 말도 안 되는 3500배 향상된 성능 를 입력합니다.

배열 인덱스에 모든 항목 사용

배열 인덱싱 지원 누구에게나 연산자를 사용합니다. 이 연산자는 배열 인덱스가 생성된 배열 요소의 널이 아닌 집합에서 부울 일치 항목을 찾는 데 사용할 수 있습니다. 예를 들어, 다음 쿼리는 다음을 찾습니다.  "the 일정 일주일 동안 유나이티드 항공의 모든 항공편이 최소 1편 이상 10편 미만인 노선의 비율".

배열 인덱스와 함께 ALL 사용

Couchbase 4.5에서를 사용하여 배열 인덱스를 만들 수 있습니다. 배열을 구분하는 키워드만 사용하여 인덱스를 생성합니다. 카우치베이스 4.5 릴리스에서는 배열 요소의 모든 값으로 배열 인덱스를 생성하는 ALL 키워드에 대한 지원이 추가되었습니다. 예를 들어

배열 인덱싱에 대해 자세히 알아보고 복합 및 중첩 배열 인덱스와 같은 더 많은 예제를 보려면 Couchbase 4.5에서 확인할 수 있습니다. 문서를 클릭하고 데모.

한번 사용해 보시고 질문/의견이 있으시거나 얼마나 멋진지 알려주세요 ;-)

건배!!

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 프라사드 바라쿠르, 수석 제품 관리자, Couchbase

프라사드 바라쿠르는 카우치베이스의 수석 제품 관리자입니다. Prasad는 데이터베이스(SQL, noSQL, 빅 데이터) 및 분산 시스템 분야의 제품 및 엔지니어링 리더입니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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