N1QL 문에 대한 인덱스 어드바이저(ADVISE 문 )가 Couchbase Server 6.6에서 공식 출시되었습니다.
다음과 같이 설계되었습니다. 만들려면 최선의 노력 제공 글로벌 보조 인덱스 권장 대상 각 키 스페이스 쿼리에서 더 나은 보다 현재 존재하는 모든 기존 인덱스와 인덱스가 빌드 지연 중입니다.
기능 중 강조 표시된 부분에 대해 좀 더 자세히 설명해 보겠습니다:
-
- 최선의 노력:
- 완전성 보장 없음: 인덱스 권장 사항 없음 술어나 파생 필터가 없는 경우.
- 오탐 없는 정확성.
- GSI 지수만 추천하고 기본 지수는 추천하지 않습니다.
- 인덱스 추천은 쿼리와 관련된 각 키 스페이스에 대한 것입니다.
- 더 좋습니다: 쿼리 최적화 도구는 쿼리 실행 시 다른 모든 기존 인덱스보다 권장 인덱스를 선호합니다. 그러나 권장 인덱스가 쿼리에 대한 최적의 인덱스라는 보장은 없습니다. 현재 릴리즈의 경우, 인덱스 어드바이저는 규칙 기반 쿼리 최적화 도구에 대해서만 조언을 제공합니다. 비용 기반 쿼리 최적화 도구에 대한 지원은 다음 릴리즈에서 제공될 예정입니다.
- 최선의 노력:
위 기능의 견고성을 높이고 인덱스 어드바이저를 지속적으로 개선하기 위해 이번 릴리스에 몇 가지 혁신적인 기능이 도입되었으며, 이 글에서는 그 중 몇 가지의 설계 세부 사항을 자세히 살펴볼 것입니다.
가상 인덱스 검증 프레임워크
커버링 인덱스 추천의 경우, 커버링 속성의 정확성을 보장하는 것은 ARRAY 술어와 UNNEST 연산 모두에 대한 ARRAY 인덱스의 중첩된 객체의 복잡성으로 인해 매우 어렵습니다. To 권장 커버링 인덱스가 쿼리 실행에서 실제 커버링 스캔을 구축할 수 있는지 확인하기 위해 검증을 목적으로 새로운 피드백 프레임워크가 도입되었습니다.
아래 그림과 같이 인덱스 어드바이저는 추천 커버리지 인덱스 후보에 대한 가상 GSI 인덱스를 생성하고 쿼리 최적화 프로그램에 피드백하여 기존의 다른 모든 인덱스 중에서 최적화 프로그램에 의해 선택될 수 있는지 확인하여 실행 계획을 생성합니다. 가상 인덱스는 메타데이터를 모방하기 위한 인메모리 데이터 구조입니다. 일반 인덱스에 추가하여 옵티마이저가 인덱스 스캔 연산자를 생성할 때 다른 일반 인덱스와 동일하게 고려할 수 있도록 합니다. 검증 단계에서 커버링 스캔 연산자에 가상 인덱스가 나타나면 사용자가 생성한 후에도 동일한 방식으로 작동하므로 이를 반환할 수 있습니다.
동시에, 검증 피드백 루프는 권장 커버링 인덱스의 푸시다운 속성을 평가하는 데도 도움이 됩니다. 커버링 인덱스의 출력에 다음과 같이 인덱스 푸시다운 속성을 제공하는 "index_property"라는 새로운 필드가 있습니다:
-
- 제한 푸시다운
- 오프셋 푸시다운
- 주문 푸시다운
- 그룹 및 집계 푸시다운
- 전체 그룹 및 집계 푸시다운
이 기능이 설정되었으므로 아래에서 설명하는 새로운 영역을 탐색할 준비가 되었습니다.
커버리지 지수 추천의 지수 푸시다운
인덱스 푸시다운은 쿼리 엔진이 더 많은 작업을 인덱서에게 푸시하는 성능 최적화 기능입니다.
인덱스 어드바이저는 쿼리 성능을 더욱 개선하기 위해 더 높은 푸시다운 속성을 가진 지수를 추천할 수 있는 가능성을 모색하기 위해 최선을 다합니다.
아래 다이어그램과 같이 커버링 인덱스 위에 세 가지 종류의 푸시다운이 적용됩니다: 그룹 기준/집계, 주문 기준, 제한/오프셋(해당되는 경우)입니다. 각각에 대해 자세히 살펴보겠습니다.
인덱스 그룹화/집계
인덱스 어드바이저는 다음과 같은 설계를 따릅니다. 인덱스 그룹화 및 집계 를 다음과 같은 측면에서 살펴볼 수 있습니다:
-
- 6가지 유형의 집계를 지원합니다: 최소, 최대, 평균, 합계, 카운트 및 카운트 수입니다.
- 더 나은 성능을 위해 인덱스 키의 순서를 조정하여 전체/부분 집계를 달성하기 위해 최선의 노력을 기울입니다.
- 전체 집계는 인덱서 는 전체 그룹 집계를 처리하여 쿼리 엔진이 이 연산자 전체를 건너뛸 수 있도록 합니다.
- 부분 집계 방식입니다, 인덱서는 쿼리에 부분 그룹 집계를 보내고 쿼리에 응답하여 중간 결과를 병합하고 최종 그룹 및 집계 연산자를 생성합니다.
-
- 전체 푸시다운이 적용될 때만 가능한 DISTINCT 집계에 대한 특수 처리.
전제 조건:
-
- 모든 술어는 커버링 인덱스가 있는 범위 스캔으로 정확하게 변환됩니다, 쿼리에 JOIN 또는 NEST가 없습니다.
사용 대상 DISTINCT가 없는 집계:
-
- 인덱스 추천 규칙에 따라 술어를 기반으로 인덱스 키를 생성합니다.
- GROUP BY 키의 위치를 동일성 술어에서 건너뛰어 선행 인덱스 키와 동등하거나 종속되도록 조정하고, tGROUP BY 키 안의 순서는 중요하지 않습니다.
- 인덱스 키와 같지 않거나 종속적이지 않은 GROUP BY 표현식의 경우 인덱스 키에 추가합니다.
- 인덱스 조건에 해당하는 GROUP BY 표현식의 경우 인덱스 조건을 인덱스 키로 이동합니다.
- 투영을 추가하여 커버링 인덱스를 생성합니다.집계 표현식은 인덱스 키의 어느 곳에나 있거나 인덱스 키 또는 메타().id에 종속됩니다.
집계 w DISTINCT 의 작동 방식 :
-
- 전체 푸시다운이 적용되는 경우에만 해당됩니다.
- 위와 동일한 규칙이 GROUP BY 표현식에도 적용됩니다.
- 고유 집계 표현식은 동일성 술어에서 (n)을 건너뛰어 선행 인덱스 키와 동등하거나 (n+1)에 종속되어야 하며, 여기서 n은 GROUP BY 항목의 수를 나타냅니다.
인덱스 순서
ORDER BY 키가 인덱스 키 순서와 정렬된 경우 쿼리 최적화 도구는 ORDER BY 연산자 생성을 건너뛸 수 있습니다. 인덱스 어드바이저는 그에 따라 조정하기 위해 최선의 노력을 기울입니다.
-
- ORDER BY 푸시다운 속성을 가진 인덱스를 생성하려면 GROUP BY가 존재하지 않는 경우 GROUP BY/Aggregate 푸시다운 또는 일반 커버링 인덱스 위에 ORDER BY 인덱스 키를 재배치합니다.
- 전체 그룹 기준/집계 푸시다운 위에만 적용됩니다.
- ORDER BY 표현식은 동일성 술어에서 인덱스 키의 순서를 건너뛰는 방식으로 인덱스 키의 순서를 따릅니다.
- ORDER BY 용어를 아래로 내릴 수 있는 경우 내림차순이 있는 용어에 "DESC"를 추가합니다.
- GROUP BY/Aggregate 푸시다운과 달리, ORDER BY 조건 내부의 순서가 중요합니다. 쿼리에 GROUP BY와 ORDER BY가 모두 존재하지만 인덱스 푸시다운을 함께 수행할 수 없는 시나리오에서 인덱스 어드바이저는 이를 개별적으로 처리하고 위에서 언급한 검증 프레임워크에 의존하여 더 나은 것을 선택하게 됩니다.
페이지 매김
지수 어드바이저는 제한/오프셋 푸시다운에 대한 특정 처리를 하지 않으며, 실제로 이전 두 푸시다운이 있는 경우 그 위에 적용하거나 원래 커버리지 지수에 직접 적용합니다.
가상 인덱스 피드백 루프에 의해 푸시다운 프로퍼티가 확인되고 해당되는 경우 "pushdown_property"에 표시되는 몇 가지 예를 아래에서 살펴 보겠습니다.
예 1:
1 2 3 4 |
조언 선택 합계(d) FROM shellTest 어디 a = 10 그리고 b < 10 그리고 c 는 not null 그룹 BY c |
커버링 인덱스의 출력은 아래와 같이 표시되며, GROUP BY 표현식 "c"는 동일성 술어에서 오는 인덱스 키 "a"의 바로 뒤에 오도록 조정되었습니다.
1 2 3 4 5 6 7 |
"커버링_인덱스": [ { "index_property": "전체 그룹 및 집계 푸시다운, 그룹 및 집계 푸시다운", "index_statement": "`쉘테스트`(`a`,`c`,`b`,`d`)에 인덱스 adv_a_c_b_d를 생성합니다.", "키스페이스_알리어스": "shellTest" } ] |
예 2:
1 2 3 4 5 |
조언 선택 c11 FROM shellTest 어디 test_id = \"조언\" 주문 BY c11 DESC LIMIT 2 |
이 출력에서 "c11"은 ORDER BY 푸시다운에 적합할 수 있으므로 이 인덱스 키에 "DESC"가 추가됩니다.
1 2 3 4 5 6 7 |
"커버링_인덱스": [ { "index_property": "주문 푸시다운, 제한 푸시다운", "index_statement": "`shellTest`(`test_id`,`c11` DESC에 인덱스 adv_test_id_c11DESC를 생성합니다."), "키스페이스_알리어스": "shellTest" } ] |
예 3:
1 2 3 4 |
조언 선택 평균(c), 합계(DISTINCT d) FROM shellTest 어디 a = 10 그리고 b < 10 그룹 BY b |
이 예제에서는 'd'에 DISTINCT 집계가 있습니다.
DISTINCT 집계는 (n+1) 선행 키에 DISTINCT 집계 표현식이 있는 전체 푸시다운에만 적용됩니다.
- "a"는 동일성 술어에서 비롯되며 건너뜁니다.
- "b"는 GROUP BY 표현식으로 이어집니다.
- 술어 및 GROUP BY의 인덱스 키는 전체 푸시다운을 사용할 수 있습니다.
- "d"는 DISTINCT 집계에서와 같이 GROUP BY 표현식 "b" 뒤에 오고 "c" 앞에 오게 됩니다.
출력 결과입니다:
1 2 3 4 5 6 7 |
"커버링_인덱스": [ { "index_property": "전체 그룹 및 집계 푸시다운, 그룹 및 집계 푸시다운", "index_statement": "`쉘테스트`(`a`,`b`,`d`,`c`) 상에 인덱스 adv_a_b_d_c 생성", "키스페이스_알리어스": "shellTest" } ] |
요약
인덱스 어드바이저는 더 나은 쿼리 성능을 위해 추천 인덱스를 최적화하기 위해 최선을 다하고 있습니다. 검증 프레임워크는 정확성과 견고성을 향상시키고, 인덱스 푸시다운을 지원하여 쿼리 성능을 더욱 개선합니다.