카우치베이스 서버

Couchbase 7.0에서 비용 기반 최적화를 위한 통계 분석하기

카우치베이스 서버 7.0 (엔터프라이즈 에디션)에는 비용 기반 최적화 도구(CBO)가 도입되었습니다. 이전 버전의 Couchbase Server는 RBO(규칙 기반 최적화 도구)를 사용했습니다. 대부분의 주요 관계형 데이터베이스 시스템과 마찬가지로 Couchbase Server도 자연스럽게 RBO에서 CBO로 발전해 왔습니다.

CBO는 비용 견적을 사용하여 최적화 도구 통계에서 계산된 쿼리 계획을 선택합니다. 옵티마이저 통계는 SQL++ 쿼리(아래에서는 N1QL이라고 함)에서 UPDATE STATISTICS 또는 ANALYZE 문을 사용하여 수집합니다.

통계/분석 문 업데이트하기

새로운 통계 업데이트 또는 분석 문은 CBO 기능에 필요한 옵티마이저 통계 수집을 트리거합니다. 현재 사용자는 이러한 새로운 문을 수동으로 실행하여 키 공간/컬렉션, 키 공간/컬렉션에 정의된 인덱스 및 용어(표현식) 목록의 분포 정보(히스토그램)에 대한 옵티마이저 통계를 계산합니다.

쿼리 노드가 여러 개 있는 경우 한 쿼리 노드에서 수집한 최적화 도구 통계는 모든 쿼리 노드에서 사용할 수 있습니다.

새로운 N1QL_SYSTEM_BUCKET

새로운 최적화 도구는 다음을 통해 통계를 수집합니다. 통계/분석 업데이트 문을 생성하고 새 버킷에 저장합니다(n1ql_system_버킷), 특히 새로운 범위(n1ql_system_scope) 및 새 컬렉션(N1QL_CBO_STATS).

처음 실행하면 통계/분석 업데이트 문을 사용하면 이 새 버킷/범위/컬렉션이 자동으로 생성됩니다. 기본 인덱스도 자동으로 생성됩니다.

새 버킷/범위/컬렉션 삭제하기
이러한 새로운 시스템 개체(버킷, 범위, 컬렉션)가 데이터베이스에서 삭제되어 모든 최적화 도구 통계를 더 이상 사용할 수 없게 될 수 있습니다.

향후 쿼리는 사용자가 통계를 다시 분석하도록 요청할 때까지 CBO 기능을 활용할 수 없습니다. 그때까지는 쿼리 계획을 위해 시스템이 RBO로 돌아갑니다.

새 버킷/범위/컬렉션에 대한 메모리 할당량
새로운 시스템 버킷(n1ql_system_버킷)는 최소 100MB의 메모리 할당량으로 생성됩니다. 대규모 시스템에서 DBA는 버킷의 메모리 잔여량을 모니터링해야 하며, 메모리 잔여량이 권장되는 15% 수준 이하로 떨어지지 않도록 필요한 경우 메모리 할당량을 늘려야 합니다.

구문

크게 보면 업데이트 통계/분석 문에는 세 가지 측면이 있습니다:
1. 키 스페이스/수집 통계 - 업데이트/분석 명세서가 발행될 때마다 수집됩니다.
2. 색인 통계 - "관련" 인덱스를 위해 수집된
3. 분포 통계(히스토그램) - 지정된 조건에 따라 수집됩니다.

배포 통계가 수집되는 용어 목록을 지정하는 방법에는 여러 가지가 있습니다.

통계를 작성할 용어 목록 제공

이 두 문장은 동일합니다. The 통계 업데이트 문에는 선택 사항인 FOR 키워드 뒤에 키스페이스 이름이 있습니다. 키스페이스 이름 뒤에 분석 문에는 선택적 키스페이스 또는 컬렉션 키워드 뒤에 키스페이스 이름을 붙입니다.

키스페이스 이름은 일반적으로 컬렉션 이름입니다. 버킷 이름을 키스페이스 이름으로 지정할 수 있으며, 이 경우 최적화 도구 통계가 _기본값 컬렉션 아래의 _기본값 버킷의 범위를 설정합니다.

용어 목록은 다음에서 사용되는 표현식 목록과 유사합니다. 인덱스 생성 문을 사용할 수 있습니다. 실제로 지원되는 모든 표현식은 인덱스 생성 명령문은 또한 통계/분석 업데이트 문을 사용합니다. 예를 들어

위의 문은 다음과 같은 경우 단순화할 수 있습니다. 쿼리 컨텍스트 로 설정되어 있습니다. travel-sample.inventory:

기능 키 표현식

함수 인덱스 키를 지정하는 것과 유사하게 인덱스 생성 문에서 함수 키를 지정할 수도 있습니다. 통계/분석 업데이트 문을 사용합니다. 예를 들어

배열 키 표현식

배열 인덱스 키를 지정하는 것처럼 인덱스 생성 문에서 배열 인덱스 키를 지정할 수도 있습니다. 통계/분석 업데이트 문을 사용합니다. 예를 들어

또는 속기 버전을 사용하세요:

하나 이상의 인덱스 분석

분석 문은 선택적으로 다음을 사용하여 하나 이상의 인덱스를 지정할 수 있습니다. INDEX 옵션을 선택합니다:

언제 INDEX 옵션을 지정하면 모든 인덱스에 대한 인덱스 키 표현식 목록이 통계/분석 업데이트 문을 사용합니다.

표현식의 어디 절도 분석용 용어에 추가됩니다. 따라서 INDEX 옵션은 사용자가 모든 용어를 명시적으로 나열할 필요가 없으므로 편리한 바로 가기입니다.

위의 문은 각 인덱스에 하나의 인덱스 키만 있고 어디 절을 참조합니다:

모든 인덱스 분석

한 단계 더 나아가 컬렉션에 정의되어 있고 온라인 상태인 사용 가능한 모든 인덱스를 고려하는 업데이트 통계/분석 문에 INDEX ALL 옵션을 사용할 수 있습니다. 예를 들어

다른 옵션을 사용하면 버킷 이름이나 컬렉션 이름을 지정할 수 있지만 인덱스 모두 옵션은 컬렉션에만 유효합니다. 지정 인덱스 모두 을 버킷 이름과 함께 사용하면 오류가 반환됩니다.

인덱스 레지던시

분석은 관련 인덱스에 대한 최적화 도구 통계도 업데이트합니다. 용어 목록이 지정되면 목록에 있는 용어를 참조하는 인덱스 키를 확인하여 해당 인덱스 목록이 구성됩니다. 관련 인덱스 목록은 다음과 같은 경우 인덱스에서 추론됩니다. INDEX 또는 인덱스 알L 옵션이 사용됩니다.

인덱스에 대한 옵티마이저 통계는 인덱스가 적어도 부분적으로 메모리에 상주하는 경우에만 수집할 수 있습니다. 옵티마이저 통계는 인덱스의 메모리 상주 부분에서 수집됩니다. 메모리 상주 비율이 높을수록 해당 인덱스에 대한 옵티마이저 통계가 더 정확해집니다.

인덱스의 메모리 상주 비율이 0인 경우 최적화 문에 의해 다음과 같은 경고가 반환됩니다:

선택적 WITH 절

유사하게 인덱스 생성 문을 지정할 수도 있습니다. WITH 절을 추가하여 통계 분석 옵션을 추가할 수 있습니다. 예를 들어

현재 지원되는 옵션은 다음과 같습니다. WITH 조항의 통계/분석 업데이트 문을 사용합니다: 해상도, 샘플 크기, 배치 크기, 업데이트_통계_타임아웃. 아래에서 각각에 대해 설명합니다.

해상도 옵션

용어의 분포 통계(히스토그램)는 일련의 '구간차원'으로 표시됩니다. 해상도는 각 구간차원에 표시되는 문서의 비율을 나타냅니다. 기본적으로 1.0(즉, 100개의 구간차원)의 해상도가 사용됩니다.

WITH 절에 다른 해상도를 지정할 수 있습니다. 예를 들어 더 세분화된 분포 통계가 필요한 경우 더 작은 해상도(더 많은 수의 구간차원에 해당)를 지정할 수 있습니다.

해상도가 작을수록(빈 수가 많을수록) 히스토그램을 구성하는 데 더 많은 샘플이 필요하며, 히스토그램을 완성하는 데 더 많은 시간/리소스가 필요합니다. 통계/분석 업데이트 문을 사용합니다.

해상도 옵션의 유효한 범위는 0.02 - 5.0입니다.

sample_size 옵션

에 지정된 용어에 대한 분포 통계(히스토그램)를 구성하려면 샘플이 필요합니다. 통계/분석 업데이트 문으로 설정합니다. 해상도에 따라 샘플 크기가 결정되며 컬렉션의 문서 수와는 직접적인 관련이 없습니다.

사용할 샘플 크기를 지정할 수 있습니다. 그러나 지정된 해상도에는 최소 샘플 크기가 필요합니다. 샘플 크기가 최소 필수 샘플 크기보다 작으면 최소 필수 샘플 크기가 대신 사용되며 경고가 반환됩니다.

batch_size 옵션

히스토그램을 만들려면 정렬 작업이 필요하므로 리소스를 많이 사용합니다. 과도한 리소스 사용을 피하기 위해 히스토그램은 일괄적으로 구축됩니다. 기본적으로 각 배치는 히스토그램 구성을 위해 최대 10개의 용어를 처리합니다. 더 많은 용어가 나열되거나 인덱스 키 표현식(인덱스 옵션으로 지정된 인덱스에서)의 조합이 10개 용어를 초과하는 경우 모든 용어를 처리하려면 여러 개의 배치가 필요합니다.

다음을 지정할 수 있습니다. 배치 크기 옵션을 사용하여 각 배치에서 처리할 용어 수를 서버에 알릴 수 있습니다. 예를 들어 시스템이 사용 중이지 않고 컴퓨팅 리소스를 충분히 사용할 수 있는 경우 사용자는 더 큰 배치 크기를 요청할 수 있습니다. 반면에 시스템이 이미 과부하 상태라면 더 작은 배치 크기를 사용할 수 있습니다. 이는 리소스 사용량과 분석 문 지속 시간 간의 균형입니다.

업데이트_통계_타임아웃 옵션

그리고 통계/분석 업데이트 문은 유지 관리 작업이며 특히 여러 개의 배치가 필요한 경우 응답 시간이 단순 쿼리보다 훨씬 더 길어질 수 있습니다.

기본적으로 60초의 시간 제한 값이 업데이트/분석 문에 적용됩니다. 시간 제한 값에 선택적 값(초 단위)을 지정할 수 있습니다. 여러 배치가 필요한 경우 시간 초과 값은 각 배치에 적용됩니다.

삭제 절

사용자는 다음을 사용하여 현재 최적화 도구 통계를 삭제할 수 있습니다. 삭제 절을 업데이트/분석 문과 함께 사용하세요. 이 절은 쿼리 또는 쿼리 집합에 대해 CBO를 선택적으로 비활성화합니다.

지정하는 방법에는 몇 가지가 있습니다. 삭제 옵션 - 옵티마이저 통계를 삭제할 용어 목록을 지정하거나 키스페이스/컬렉션에 대한 모든 옵티마이저 통계를 삭제하도록 요청할 수 있습니다.

용어 목록이 포함된 삭제 절

이 옵션을 사용하면 쿼리에서 지정된 용어에 대한 배포 통계만 삭제됩니다. 키 스페이스 및 인덱스 통계와 같은 다른 최적화 도구 통계는 영향을 받지 않습니다. 이 옵션을 사용하면 쿼리에 '공항' 컬렉션의 '도시' 또는 '국가' 필드에 술어가 있는 경우 해당 쿼리에 대해 CBO가 비활성화됩니다.

키스페이스/컬렉션의 모든 옵티마이저 통계에 대한 삭제 절

이 옵션을 사용하면 키 공간 통계, 인덱스 통계, 배포 통계를 포함하여 "airport" 컬렉션에 대한 모든 최적화 도구 통계가 삭제됩니다. 이 경우 "airport" 컬렉션을 참조하는 모든 쿼리에는 CBO가 비활성화됩니다.

어떤 필드/표현식을 분석할까요?

어떤 필드/표현식을 포함할지 어떻게 알 수 있나요? 통계/분석 업데이트 문을 사용해야 하나요? 일반적으로 쿼리에서 참조되는 모든 표현식(투영 절에 있는 표현식만 제외)에는 최적화 도구 통계가 필요합니다.

WHERE, ON, GROUP BY, ORDER BY 절

에 참조된 표현식 어디서, 켜기, 그룹화 기준 그리고 주문 기준 절에는 최적화 도구 통계가 필요합니다. 예를 들어

이 쿼리의 경우 옵티마이저 통계가 필요합니다:

더 복잡한 표현식을 사용하는 경우:

이 쿼리의 경우 옵티마이저 통계가 필요합니다:

배열 인덱스 표현식

For ANY 또는 누구에게나 절에서 배열 인덱스를 사용하는 경우 해당 배열 인덱스 키 표현식에 대한 최적화 도구 통계가 필요합니다. 예를 들어

이 쿼리의 경우 옵티마이저 통계가 필요합니다:

사용된 표현식은 해당 배열 인덱스 정의의 배열 인덱스 키 표현식과 동일하다는 점에 유의하세요.

의 경우 UNNEST 작동합니다:

이 쿼리의 경우 옵티마이저 통계가 필요합니다:

다시 말하지만, 사용된 표현식은 해당 배열 인덱스 정의에 대한 배열 인덱스 키 표현식과 동일합니다.

하위 쿼리 및 CTE(공통 테이블 표현식)

하위 쿼리 또는 CTE가 포함된 쿼리의 경우, 하위 쿼리 또는 CTE의 쿼리 블록을 확인하여 어떤 표현식에 최적화 도구 통계가 필요한지 확인합니다:

CTE를 정의하는 쿼리 블록을 보면 최적화 도구 통계가 필요합니다:

창 기능

창 함수를 사용하는 경우 PARTITION BY 및 ORDER BY 절에 사용된 표현식에 대한 옵티마이저 통계가 필요합니다:

이 쿼리의 경우 옵티마이저 통계가 필요합니다:

최적화 도구 통계 보기

옵티마이저 통계를 위해 새로 도입된 시스템 키 공간은 시스템:사전과 시스템:사전_캐시 두 가지입니다. 첫 번째는 다음에 저장된 온디스크 문서에 해당합니다. n1ql_system_bucket.n1ql_system_scope.n1ql_cbo_stats, 시스템:사전_캐시는 동일한 정보의 하위 집합에 대한 인메모리 캐시 표현에 해당합니다.

사전 캐시는 쿼리 노드가 시작될 때 초기화되며 쿼리를 실행할 때 캐시 정보가 채워집니다. 다음에서 검색된 데이터는 시스템:사전 는 여러 쿼리 노드를 사용할 때 어떤 쿼리 노드가 정보를 가져오는지에 관계없이 동일합니다.

그러나 멀티노드 클러스터의 모든 쿼리 노드에서 캐시된 정보는 시스템:사전_캐시, 각 노드는 잠재적으로 캐시된 정보의 다른 하위 집합을 가질 수 있습니다.

이 쿼리는 시스템:사전의 통계를 보여줍니다:

쿼리 결과는 다음과 같습니다:

각 항목에는 키 공간에 대한 기본 정보, 키 공간의 배열 배포 키 히스토그램과 인덱스 정보 배열을 사용할 수 있습니다.

마찬가지로 시스템:사전_캐시를 쿼리할 때도 마찬가지입니다:

결과는 다음과 같습니다. 시스템:사전 쿼리에서 다른 쿼리 노드의 항목을 표시하는 추가 노드 필드를 제외합니다.

최적화_추정값으로 출력 설명하기

적절한 옵티마이저 통계를 사용할 수 있는 경우 EXPLAIN 출력에 각 연산자에 대한 새로운 optimizer_estimates 섹션이 포함됩니다. 이 섹션에는 이 연산자 및 모든 하위 연산자의 비용 정보에 대한 최적화 도구의 추정치가 반영됩니다. 예를 들어

다음 출력은 IndexScan3 연산자에 대한 출력입니다:

다음과 같이 optimizer_estimates 섹션은 데이터베이스가 쿼리 계획 프로세스의 이 단계에서 CBO를 사용하고 있음을 나타냅니다.

요약

비용 기반 최적화 도구(CBO)의 추가는 많은 기능 중 하나에 불과하지만, 혁신적인 새 데이터베이스 기능을 Couchbase 7.0에서 사용할 수 있게 되었습니다. 이 블로그 게시물에 표시된 업데이트/분석 쿼리는 CBO가 효율적으로 작동하는 데 필요한 통계를 수집하는 데 필수적입니다.

데이터베이스에서 정확한 최적화 도구 통계를 수집하면 EXPLAIN 출력에 CBO가 쿼리 계획을 선택하는 데 사용할 예상치가 표시됩니다. 이는 향후 보다 효율적이고 예측 가능한 쿼리 생성을 안내하는 데 도움이 됩니다.

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

작성자

게시자 빙지에 미아오, 수석 소프트웨어 엔지니어 Couchbase

빙지에 미아오는 Couchbase의 수석 소프트웨어 엔지니어입니다. Bingjie는 관계형 및 NoSQL 데이터베이스 분야에서 20년의 경력을 보유하고 있습니다. 그의 주요 전문 분야는 쿼리 최적화 및 쿼리 실행입니다.

댓글 하나

  1. 도움이 되었습니다. 감사합니다, 빙지에.

    쿼리: 현재 오라클에서 제공하는 것과 같이 통계를 수집할 수 있는 기본 제공 작업이 없습니다. 따라서 크론 작업을 사용하여 정기적으로 수동으로 수행해야 합니다. 제 이해가 맞나요?

    1. 빙지에 미아오, 수석 소프트웨어 엔지니어, Couchbase 12월 7, 2023에서 10:18 오전

      네, 정확한 이해입니다. 현재 최적화 도구 통계 수집은 수동 프로세스입니다. 더 쉽게 사용할 수 있도록 이 부분을 개선하는 방안을 고려하고 있습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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