개요

인덱스 어드바이저는 카우치베이스 서버 6.5에 개발자 미리 보기 기능으로 도입되었습니다. 이 기능은 DBA와 개발자가 N1QL 쿼리 성능을 최적화하는 데 도움이 되는 보조 인덱스 추천을 제공하는 것을 목표로 합니다. 이 버전은 규칙 기반이며, 인덱스 후보가 다음에서 지정된 디자인 규칙에 따라 생성됩니다. https://www.couchbase.com/blog/create-right-index-get-right-performance/:

1. 언네스트에 대한 선행 배열 인덱스 키

2. 동일성 술어

3. IN 술어

4. 술어보다 작지 않음/사이/보다 크지 않음

5. 술어보다 작음/보다 큼

6. 배열 술어

7. 왼쪽 키 공간의 선행 키로 파생된 조인 필터

8. IS NOT NULL/누락/값이 없는 술어

9. 기능 술어

10. 부분 인덱스 조건

인덱스 어드바이저는 두 가지 방식으로 작동하도록 설계되었습니다:

    • N1QL 문을 사용하여 단일 쿼리에 대한 인덱스를 조언합니다.
    • 쿼리 워크로드에 대해 조언하고 세션 처리를 지원하는 어드바이저 기능.

이 글에서는 첫 번째 기능에 초점을 맞추고 내부적으로 어떻게 작동하는지에 대한 몇 가지 인사이트를 공유하고자 합니다.

어드바이스 성명서 세부 정보

N1QL 문 구문:

자문 [인덱스 ]

SELECT/삭제/업데이트/ANSI MERGE의 쿼리 유형을 지원하며, 단일 키 공간에 대한 작업, ANSI JOIN/NEST, INDEX JOIN/NEST, UNNEST 및 FROM 절의 하위 쿼리에 대한 인덱스 권장 사항을 제공합니다.

인덱스 어드바이저가 따르는 기본 지침은 다음과 같습니다:

    1. 올바른 구문을 사용하여 인덱싱 가능한 술어, 투사, GROUP BY/ORDER BY 표현식을 기반으로 보조 인덱스 후보를 생성합니다.
    2. UNNEST의 경우 선행 배열 인덱스 키에 대한 조정과 ANSI JOIN의 경우 파생된 ISNOTNULL 필터를 사용하여 술어 유형의 우선 순위에 따른 규칙에 따라 인덱스 키를 정렬합니다.
    3. 권장 인덱스가 현재 모든 기존/유예 인덱스보다 우수해야 하며 쿼리 실행 시 현재 규칙 기반 쿼리 최적화 도구에 의해 선택되어야 합니다.

먼저 간단한 예제의 결과를 살펴보겠습니다:

쿼리 1:

조언 출력에는 두 가지 부분이 있습니다:

  • 현재 인덱스:

이 세션에서는 입력 쿼리를 실행하기 위해 쿼리 옵티마이저가 현재 사용하고 있는 인덱스에 대한 정보를 제공합니다. 또한 인덱스가 권장 인덱스와 동일하거나 최적의 커버링 인덱스인 경우 인덱스의 상태에 대한 정보도 포함됩니다. 두 경우 모두 인덱스 추천은 제공되지 않습니다.

  • 추천 색인:
    • 색인:

이 세션에서는 WHERE/ON 절의 술어를 기반으로 하는 권장 인덱스와 각 인덱스가 따르는 해당 권장 규칙을 나열합니다.

    • 커버링 인덱스:

이 세션에서는 입력 쿼리에 적용할 수 있는 커버링 인덱스를 나열합니다.

부분 색인

카우치베이스 데이터 모델은 유연한 스키마를 갖춘 JSON이며, 하나의 버킷에 여러 유형의 문서가 들어 있는 이질적인 형태가 될 수 있습니다. 일반적으로 데이터 항목에는 분류를 위한 '유형' 필드가 포함됩니다. 쿼리에 특정 유형의 문서에 대한 필터가 포함된 경우, WHERE 절에 "type" 필드가 있는 부분 인덱스가 제공됩니다. 이는 인덱스 크기를 최소화하고 인덱스 액세스 경로를 단축하며 쿼리를 보다 효율적으로 실행하는 데 도움이 될 수 있습니다.

위의 쿼리 예제에서 권장 인덱스는 WHERE 절에 "type = 'route'"가 추가된 부분 인덱스로, "route" 유형의 문서에 대해서만 인덱스를 생성합니다:

내부적으로 인덱스 어드바이저는 INFER 문의 "flavor" 통계를 사용하여 술어의 필드를 일치시키고 이를 부분 인덱스 조건에 추가합니다.

더 많은 아이디어를 얻기 위해, 각 키 공간에 대해 인덱스 조건으로 "type" 필드가 있는 부분 인덱스가 권고되는 여러 유형의 문서에 대해 ANSI JOIN으로 쿼리를 실행해 보겠습니다:

쿼리 2:

배열 술어에 대한 배열 인덱스

JSON은 중첩된 스칼라 필드, 객체, 배열로 구성된 계층적 구조입니다. 배열 인덱스 키는 중첩된 배열 깊숙이 들어가서 인덱싱해야 하는 요소나 객체의 필드를 명확하게 참조할 수 있습니다. 인덱스 어드바이저는 다음에서 바인딩과 표현식을 재귀적으로 탐색하여 배열 인덱스를 추천합니다. ANY 범위 술어입니다.

쿼리 3:

사용자는 배열의 오브젝트 요소와 필드에 추가 로직과 처리를 유연하게 적용할 수 있으므로 ANY 식과 같이 복잡한 함수, 배열 식, 부울 조건 등을 지원하기 위해 인덱스 어드바이저는 아래 쿼리에서와 같이 노력할 것입니다:

쿼리 4:

UNNEST 연산을 위한 배열 인덱스

UNNEST는 중첩된 배열과 상위 객체의 조인 연산을 수행하는 데 사용됩니다. 이 작업의 술어가 중첩 배열의 개별 요소에 적용되는 경우 배열 인덱스는 쿼리 실행을 최적화하는 데 도움이 됩니다.

N1QL 쿼리 옵티마이저는 인덱스 정의에 모든 배열 요소가 색인된 적절한 선행 배열 키가 있는 경우 중첩 해제 스캔과 중첩 해제 커버링 스캔을 지원합니다. 인덱스 어드바이저는 이 규칙에 따라 중첩 해제 식을 수집하고 추천을 위해 배열 인덱스를 역으로 생성합니다. 아래 예시를 살펴보겠습니다:

쿼리 5:

커버링 인덱스

커버링 인덱스는 특정 쿼리에 필요한 모든 데이터를 제공하고 데이터 서비스에서 문서를 가져올 때 발생하는 오버헤드를 피할 수 있습니다. 인덱스 어드바이저는 다음 단계에서 해당되는 경우 입력 쿼리에 대해 이 효율적인 커버링 인덱스를 조언합니다:

    • 먼저 WHERE/ON 절의 모든 술어에서 인덱스 키를 수집합니다.
    • 그런 다음 나머지 투영과 GROUP BY/ORDER BY 표현식을 인덱스 정의에 추가하고 잠정 커버링 인덱스 후보를 생성합니다.
    • 마지막으로, 쿼리 최적화 도구와 동일한 접근 방식을 사용하여 인덱스 표현식이 쿼리를 처리하는 데 필요한 모든 데이터를 제공할 수 있는지 확인합니다.

이전 쿼리 예제에서는 단일 키 공간 쿼리, JOIN 연산, ANY 식 및 UNNEST 술어에 대해 커버링 인덱스와 커버링 배열 인덱스가 제공된다는 것을 보여주었습니다.

인덱스 명명 규칙

인덱스 어드바이저에서 인덱스 이름은 세 가지 요구 사항을 충족하도록 설계되었습니다:

    1. 모든 인덱스 키를 밑줄로 연결하여 인덱스 구성을 반영합니다.
    2. "adv-" 접두사를 추가하여 사용자 정의 인덱스와 구분합니다.
    3. 잘라내고 해시 코드로 대체하여 적당한 길이로 조정합니다.

일반 인덱스 및 배열 인덱스의 형식은 다음과 같습니다:

  • ADV_FIELD1_FIELD2_FIELD3...
  • adv_[DISTINCT/ALL]_level1_level2_level3...

Couchbase 인덱싱에서는 중복 이름이 지원되지 않으며, 인덱스 어드바이저는 권장 사항에서 인덱스 이름의 고유성을 보장하지 않습니다. 이 오류가 발생하면 인덱스 이름을 변경해야 합니다.

요약

인덱스 어드바이저(ADVISE 문)는 단일 쿼리에 대한 인덱스 권장 사항을 제공합니다. 일반 인덱스, 부분 인덱스, 배열 인덱스, 커버링 인덱스를 추천하고 각 인덱스 키가 따르는 해당 추천 규칙에 대한 정보를 제공합니다. 또한 하나의 쿼리별로 현재 사용되는 인덱스를 평가하여 불필요한 추천을 피합니다.

DP 기능으로 출시된 인덱스 어드바이저는 아직 초기 단계에 있습니다. 고객의 요구 사항을 더 잘 충족하고 쿼리 최적화에 기여할 수 있도록 기능과 사용성이 더욱 개선될 예정입니다.

리소스

6.5의 기능이 마음에 드셨는지, 앞으로 비즈니스에 어떤 도움이 될지 여러분의 의견을 듣고 싶습니다. 댓글을 통해 의견을 공유해 주시거나 포럼.

작성자

게시자 창 리우

N1QL 쿼리 팀의 소프트웨어 엔지니어

댓글 남기기