SQL++/N1QL 쿼리

Couchbase Server 5.0의 새로운 프로파일링 및 모니터링 미리보기

N1QL 쿼리 모니터링 및 프로파일링 업데이트는 2월 개발자 프리뷰 릴리스인 Couchbase Server 5.0.0에서 확인할 수 있는 몇 가지 좋은 기능 중 일부에 불과합니다.

이동 Couchbase Server 2월 5.0.0 개발자 릴리스 다운로드 지금 바로 '개발자' 탭을 클릭하고 확인해 보세요. 아직 정식 출시 전까지 피드백을 보내주실 수 있습니다.

항상 그렇듯이 이 블로그 게시물은 초기 빌드에 대해 작성하고 있으며, 출시 시점에는 일부 사항이 사소한 방식으로 변경될 수 있다는 점을 염두에 두시기 바랍니다.

프로파일링과 모니터링은 무엇을 위한 것인가요?

N1QL 쿼리를 작성할 때, 개선하고 문제를 진단하기 위해서는 쿼리(및 클러스터)의 성능(또는 성능 저하)을 파악할 수 있어야 합니다.

이 최신 개발자 버전의 Couchbase Server 5.0에서는 N1QL 작성 도구 상자에 몇 가지 새로운 도구가 추가되었습니다.

N1QL 작성 검토

먼저, 몇 가지 검토를 해보겠습니다.

개발자가 N1QL 쿼리를 실행하는 방법에는 여러 가지가 있습니다.

이 글에서는 주로 쿼리 워크벤치를 사용하겠습니다.

두 가지가 있습니다. 시스템 카탈로그 오늘 소개해드릴 Couchbase Server 4.5에서 이미 사용할 수 있는 기능입니다.

  • 시스템:활성_요청 - 이 카탈로그에는 현재 실행 중인 모든 활성 요청 또는 쿼리가 나열됩니다. N1QL 쿼리를 실행할 수 있습니다. SELECT * FROM system:active_requests; 를 입력하면 모든 결과가 나열됩니다.
  • 시스템:완료_요청 - 이 카탈로그에는 최근에 완료된 모든 요청(일정 시간 이상 실행된 요청, 기본값은 1초)이 나열됩니다. 다음을 실행할 수 있습니다. SELECT * FROM system:completed_requests; 를 입력하면 이러한 쿼리가 나열됩니다.

N1QL을 처음 사용하세요: META().plan

둘 다 active_requests 그리고 완료_요청 는 원본 N1QL 쿼리 텍스트뿐만 아니라 요청 시간, 요청 ID, 실행 시간, 스캔 일관성 등 관련 정보도 반환합니다. 이는 유용한 정보가 될 수 있습니다. 다음은 간단한 쿼리를 살펴보는 예제입니다(여행 샘플에서 *를 선택합니다.)를 실행하여 실행하는 동안 시스템:활성_요청에서 *를 선택합니다;

먼저, 다음과 같은 점을 지적하고 싶습니다. phaseTimes 가 결과에 새롭게 추가되었습니다. 전체 프로필을 보지 않고도 쿼리 비용을 빠르고 간단하게 파악할 수 있는 방법입니다. 각 운영자를 자세히 살펴보지 않고도 각 요청 단계의 전체 비용을 확인할 수 있습니다. 예를 들어 위의 예에서 다음을 확인할 수 있습니다. parse 500µs가 걸렸고 primaryScan 107.3891ms가 걸렸습니다. 이 정도면 자세히 알아보지 않고도 충분히 알 수 있는 정보입니다. META().plan.

하지만 새로운 META().plan를 클릭하면 쿼리 계획에 대한 매우 자세한 정보를 얻을 수 있습니다. 이번에는 SELECT *, META().plan FROM system:active_requests;

위의 출력은 쿼리 워크벤치에서 가져온 것입니다.

새로운 "plan" 부분에 주목하세요. 여기에는 N1QL 쿼리를 실행하기 위해 결합되는 연산자 트리가 포함되어 있습니다. 루트 연산자는 시퀀스이며, 이 시퀀스에는 Authorize, PrimaryScan, Fetch 등의 하위 연산자 컬렉션과 더 많은 시퀀스가 있습니다.

프로필 기능 활성화하기

cbq 또는 REST API를 사용할 때 이 정보를 얻으려면 '프로필' 기능을 켜야 합니다.

다음에서 이 작업을 수행할 수 있습니다. cbq 를 입력하여 프로필 타이밍을 설정합니다; 를 클릭한 다음 쿼리를 실행합니다.

요청별로 REST API를 사용하여 이 작업을 수행할 수도 있습니다( /query/service 엔드포인트에 쿼리 문자열 매개 변수를 전달하고 프로필=타이밍를 예로 들 수 있습니다).

기본 인증을 사용하여 https://localhost:8093/admin/settings 에 POST 요청을 하고 다음과 같은 JSON 본문을 보내면 전체 노드에 대한 설정을 켤 수 있습니다:

주목하세요. 프로필 설정을 변경했습니다. 이전에는 꺼짐으로 설정되어 있었지만 '타이밍'으로 설정했습니다.

특히 다른 사람이나 프로그램에서 사용하는 노드에서는 노드에서 실행 중인 다른 쿼리에 영향을 줄 수 있으므로 이 작업을 수행하지 않는 것이 좋습니다. 이 작업은 요청별로 수행하는 것이 좋습니다.

이 작업은 기본적으로 쿼리 워크벤치에서 수행하는 작업이기도 합니다.

쿼리 워크벤치 사용

많은 정보가 있습니다. META().plan 계획이 실행되는 방식에 대해 설명합니다. 개인적으로 저는 쿼리 워크벤치에서 '계획' 아이콘을 클릭하여 단순화된 그래픽 버전으로 보는 것을 선호합니다. 새로운 Couchbase 웹 콘솔에 대한 이전 게시물 UI).

Query Workbench plan results

조금 더 복잡한 예를 살펴보겠습니다. 이 연습에서는 여행 샘플 버킷을 사용하지만 인덱스 중 하나를 제거했습니다(DROP INDEX 여행 샘플.def_sourceairport;).

그런 다음 N1QL 쿼리를 실행하여 샌프란시스코와 마이애미 간 항공편을 찾습니다:

이 쿼리를 실행하는 데 (제 단일 노드 로컬 컴퓨터에서) 약 10초가 걸립니다. 이는 결코 용납할 수 없는 시간이므로 문제가 무엇인지 확인하기 위해 계획을 살펴 보겠습니다(블로그 게시물에 스크린샷이 들어갈 수 있도록 두 줄로 나누었습니다).

Query Workbench plan part 1

Query Workbench plan part 2

이 계획을 살펴보면 쿼리에서 가장 비용이 많이 드는 부분은 다음과 같습니다. 필터가입. JOIN 연산은 키에서 작동하므로 일반적으로 매우 빨라야 합니다. 하지만 lot 가입되는 문서의 수입니다.

필터( 어디 쿼리의 일부)도 많은 시간이 소요되고 있습니다. 이 쿼리는 소스공항 그리고 목적지공항 필드가 있습니다. 계획의 다른 부분을 살펴보면 다음과 같이 기본 스캔. 성능 좋은 쿼리를 작성하려고 할 때 이것은 적신호입니다. PrimaryScan은 쿼리가 기본 인덱스 이외의 인덱스를 찾지 못했음을 의미합니다. 이것은 관계형 데이터베이스 용어로 "테이블 스캔"과 거의 같습니다. (이러한 문제가 더 빨리 해결되도록 기본 인덱스를 삭제하는 것이 좋지만, 이는 다음 주제입니다).

에 인덱스를 추가해 보겠습니다. 소스공항 필드로 이동하여 도움이 되는지 확인하세요.

이제 위와 동일한 쿼리를 실행하면 다음과 같은 계획이 표시됩니다:

Query Workbench improved plan part 1

Query Workbench improved plan part 2

이 쿼리는 (단일 노드 로컬 머신에서) 약 100ms가 걸렸는데, 이는 훨씬 더 수용 가능한 속도입니다. 그리고 필터가입 여전히 많은 시간을 차지하지만, 덕분에 IndexScan기본 스캔를 사용하면 작업자가 처리해야 하는 문서가 훨씬 줄어듭니다. 아마도 쿼리를 더욱 개선하려면 목적지공항 필드에 입력합니다.

쿼리 조정 그 이상

성능 문제에 대한 해답이 항상 쿼리 조정에 있는 것은 아닙니다. 때로는 근본적인 문제를 해결하기 위해 클러스터에 노드를 더 추가해야 할 수도 있습니다.

보세요. 기본 스캔 정보 META().plan. 다음은 스니펫입니다:

그리고 servTime 값은 쿼리 서비스가 키/값 데이터 저장소에서 대기하는 데 소요되는 시간을 나타냅니다. 만약 servTime 가 매우 높지만 처리 중인 문서 수가 적다면 인덱서(또는 키/값 서비스)가 이를 따라잡을 수 없다는 뜻입니다. 아마도 다른 곳에서 너무 많은 부하가 발생하고 있을 수 있습니다. 즉, 다른 곳에서 이상한 무언가가 실행되고 있다는 뜻입니다. 또는 클러스터가 너무 많은 부하를 처리하려고 한다는 의미입니다. 노드를 더 추가해야 할 때일 수 있습니다.

마찬가지로 kernTime 는 다른 N1QL 루틴에서 대기하는 데 소요되는 시간입니다. 이는 쿼리 계획의 다른 다운스트림에 문제가 있거나 쿼리 노드에 요청이 넘쳐서 많이 기다려야 한다는 것을 의미할 수 있습니다.

여러분의 피드백을 기다립니다!

새로운 META().plan 기능과 새로운 Plan UI가 Couchbase Server 5.0에서 결합되어 N1QL 작성 및 프로파일링 프로세스를 개선합니다.

앞으로도 계속 지켜봐 주세요. 카우치베이스 블로그 를 참조하여 다음 개발자 빌드에 포함될 기능에 대한 정보를 확인하세요.

이러한 새로운 기능을 사용해보고 싶으신가요? Couchbase Server 5.0 다운로드 오늘!

여러분의 피드백을 기다립니다! 매달 개발자 릴리스가 출시되므로, 여러분은 저희가 구축하는 기능에 변화를 가져올 수 있는 기회를 갖게 됩니다.

버그: 버그(깨지거나 예상대로 작동하지 않는 것)를 발견하면 다음에서 문제를 제기하세요. JIRA 시스템(issues.couchbase.com) 에 질문을 제출하거나 카우치베이스 포럼. 또는 문제에 대한 설명과 함께 저에게 연락해 주세요. 기꺼이 도와드리거나 버그를 제출해 드리겠습니다(제가 좋은 버그를 제출할 때마다 Couchbase 담당자가 저에게 하이파이브를 해 줍니다).

피드백: 어떻게 생각하는지 알려주세요. 마음에 들지 않는 부분이 있나요? 정말 좋아하는 것이 있나요? 빠진 부분이 있나요? 이제 카우치베이스 웹 콘솔에서 직접 피드백을 제공할 수 있습니다. 웹 콘솔에서 feedback icon 아이콘을 클릭합니다.

경우에 따라 피드백이 버그인지 제안인지 판단하기가 까다로울 수 있습니다. 최선의 판단을 내리거나 언제든지 저에게 연락하여 도움을 요청하세요. 여러분의 의견을 듣고 싶습니다. 저에게 연락하는 가장 좋은 방법은 다음 중 하나입니다. 트위터 @mgroves 또는 이메일을 보내주세요. matthew.groves@couchbase.com.

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

Author

Posted by 매튜 그로브스

Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.

댓글 하나

  1. 매우 유용한 블로그입니다. META().plan에 대한 자세한 정보를 기대하세요.
    몇 가지 질문이 있습니다:
    "servTime" 값은 쿼리 서비스가 키/값 데이터 저장소에서 대기하는 데 소요되는 시간을 나타냅니다. servTime이 매우 높지만 처리 중인 문서 수가 적다면 인덱서(또는 키/값 서비스)가 이를 따라잡을 수 없다는 뜻입니다. 아마도 다른 곳에서 너무 많은 부하가 발생하고 있을 수 있습니다. 즉, 다른 곳에서 이상한 무언가가 실행되고 있거나 클러스터가 너무 많은 부하를 처리하려고 한다는 뜻입니다. 노드를 더 추가해야 할 때일 수 있습니다."
    데이터 서비스를 실행하는 노드를 더 추가해야 할 때라는 의미인가요?

    그리고

    "kernTime은 다른 N1QL 루틴에서 대기하는 데 소요되는 시간입니다. 이는 쿼리 계획의 다른 다운스트림에 문제가 있거나 쿼리 노드에 요청이 넘쳐서 많이 기다려야 한다는 것을 의미할 수 있습니다."
    는 쿼리 서비스를 실행하는 노드를 더 추가해야 할 때라는 의미인가요?

    1. 두 가지 모두에 대한 답은 '아마도'입니다. 당시 시스템에서 어떤 일이 일어나고 있는지에 따라 달라집니다. 다른 문제가 있는 쿼리가 실행 중일 수도 있고, 현재 노드 수가 한계에 도달했음을 의미할 수도 있습니다.

  2. [...] 놓치신 분들을 위해 지난 2월에 작성한 Couchbase Server 5.0 프리뷰의 새로운 프로파일링 및 모니터링에 대한 포스팅을 확인해보시기 바랍니다.

  3. 수잔타 바티제 8월 22, 2018에서 6:56 오후

    시스템 메타데이터를 쿼리하여 시간 초과 쿼리, 지정된 데이터/시간 이후에 실행된 쿼리 등을 찾는 데 system:completed_requests가 매우 유용해 보입니다. 그러나 완료하는 데 걸리는 시간이 지나치게 길어 쿼리하기가 어렵습니다. 이 쿼리에서 종종 시간 초과가 발생합니다. 관리자 UI에서 타임아웃 값을 늘려서 사용했지만 여전히 시간이 많이 걸립니다. 그런 다음 cbq 도구를 사용했지만 운이 없었습니다. 이 기능은 유용하지만 실제 상황에서는 사용할 수 없습니다. 이것이 제가 경험한 것입니다.

    1. 수잔타, 두 가지를 고려하는 것이 좋을 것 같습니다:

      1) N1QL 포럼에 질문을 게시합니다. 해당 포럼은 매우 반응이 좋으며 도움을 줄 수 있을 것입니다. https://www.couchbase.com/forums/c/sql/16

      2) 카우치베이스 커뮤니티 디렉토리에 가입 - 카우치베이스 커뮤니티 디렉토리에 가입하세요. https://community.couchbase.com/ - 이곳은 자신과 같은 다른 Couchbase 전문가, 챔피언 및 커뮤니티 회원을 찾고 교류할 수 있는 곳입니다. 자신의 경험을 게시한 다음 완료된_requests 카탈로그에 대해 비슷한 경험을 한 사람이 있는지, 그리고 그 경험을 어떻게 처리했는지 물어볼 수 있습니다.

  4. 이 글을 작성해 주셔서 감사합니다. 도움이 되었습니다. 특히 공식 문서에서 단계에 대한 의미를 찾을 수 없었기 때문입니다. 그러나 여전히 승인 단계가 무엇인지 이해하지 못합니다 (내 쿼리 중 하나에 대해 승인하는 데 3 분 이상이 걸리거나 적어도 계획에 표시되는 것이기 때문에이를 이해하려고 노력하고 있습니다).

    또한 문서에 단계와 시간을 설명하는 공식 페이지가 있으면 그 페이지로 안내해 주세요.

    안부

    1. 안녕하세요 Purav! 이 블로그 게시물은 이전 버전의 Couchbase Server에 대한 것입니다. 여기 N1QL용 Couchbase 포럼에 질문을 게시하는 것이 좋습니다: https://www.couchbase.com/forums/c/sql/16

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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