쿼리 성능 분석

이 페이지에서는 쿼리 통계 대시보드를 사용하여 성능 문제를 감지하고 분석하는 방법을 설명합니다.

쿼리 통계 개요

쿼리 통계는 Spanner 데이터베이스의 쿼리 및 DML 문 성능 문제를 감지하고 진단하는 데 도움이 됩니다. 직관적인 모니터링을 지원하고 성능 문제를 감지하는 것뿐만 아니라 근본 원인까지 파악하는 데 도움을 주는 진단 정보를 제공합니다.

쿼리 통계는 다음 단계를 안내하여 Spanner 쿼리 성능을 향상시키는 데 도움이 됩니다.

  1. 비효율적인 쿼리가 CPU 사용률을 높이는지 확인합니다.
  2. 잠재적으로 문제가 발생할 수 있는 쿼리 또는 태그를 식별합니다.
  3. 쿼리 또는 요청 태그를 분석하여 문제를 식별합니다.

쿼리 통계는 단일 리전 구성과 멀티 리전 구성 모두에서 사용할 수 있습니다.

가격 책정

쿼리 통계에는 추가 비용이 없습니다.

데이터 보관

쿼리 통계의 최대 데이터 보관은 30일입니다. 총 CPU 사용률(쿼리 또는 요청 태그당) 그래프의 경우 최대 보관 기간이 30일인 SPANNER_SYS.QUERY_STATS_TOP_* 테이블에서 데이터를 가져옵니다. 자세한 내용은 데이터 보관을 참조하세요.

필요한 역할

IAM 사용자인지 또는 세분화된 액세스 제어 사용자인지에 따라 다른 IAM 역할 및 권한이 필요합니다.

Identity and Access Management(IAM) 사용자

쿼리 통계 페이지를 보는 데 필요한 권한을 얻으려면 관리자에게 인스턴스에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

쿼리 통계 페이지를 보려면 Cloud Spanner 데이터베이스 리더(roles/spanner.databaseReader) 역할의 다음 권한이 필요합니다.

  • spanner.databases.beginReadOnlyTransaction
  • spanner.databases.select
  • spanner.sessions.create

세분화된 액세스 제어 사용자

세분화된 액세스 제어 사용자인 경우 다음을 확인합니다.

  • Cloud Spanner 뷰어(roles/spanner.viewer)입니다.
  • 세분화된 액세스 제어 권한이 있고 spanner_sys_reader 시스템 역할 또는 구성원 역할 중 하나를 부여받았습니다.
  • 데이터베이스 개요 페이지에서 spanner_sys_reader 또는 구성원 역할을 현재 시스템 역할로 선택합니다.

자세한 내용은 세분화된 액세스 제어 정보세분화된 액세스 제어 시스템 역할을 참조하세요.

쿼리 통계 대시보드

쿼리 통계 대시보드에는 선택한 데이터베이스 및 기간을 기준으로 쿼리 로드가 표시됩니다. 쿼리 부하는 선택한 기간 내의 인스턴스에 있는 모든 쿼리의 전체 CPU 사용률을 측정한 것입니다. 대시보드는 쿼리 부하를 볼 수 있는 일련의 필터를 제공합니다.

데이터베이스의 쿼리 통계 대시보드를 보려면 다음을 수행하세요.

  1. 왼쪽 탐색 패널에서 쿼리 통계를 선택합니다. 쿼리 통계 대시보드가 열립니다.
  2. 데이터베이스 목록에서 데이터베이스를 선택합니다. 대시보드에는 데이터베이스의 쿼리 로드 정보가 표시됩니다.

대시보드의 영역은 다음과 같습니다.

  1. 데이터베이스 목록: 특정 데이터베이스 또는 모든 데이터베이스에서 쿼리 로드를 필터링합니다.
  2. 시간 범위 필터: 시간, 일 수 또는 커스텀 범위와 같은 시간 범위별로 쿼리 부하를 필터링합니다.
  3. 총 CPU 사용률(모든 쿼리) 그래프: 모든 쿼리의 집계 부하를 표시합니다.
  4. 총 CPU 사용률(쿼리 또는 요청 태그당) 그래프: 각 쿼리 또는 요청 태그별로 CPU 사용률을 표시합니다.
  5. TopN 쿼리 및 태그 테이블: CPU 사용률을 기준으로 정렬된 상위 쿼리 및 요청 태그의 목록을 표시합니다. 잠재적으로 문제가 발생할 수 있는 쿼리 또는 태그 식별을 참조하세요.

쿼리 통계 대시보드

대시보드 성능

쿼리 매개변수를 사용하거나 쿼리를 태그하여 쿼리 통계 성능을 최적화합니다. 쿼리를 매개변수화하거나 태그하지 않으면 너무 많은 결과가 반환되어 TopN 쿼리 및 태그 테이블이 제대로 로드되지 않을 수 있습니다.

비효율적인 쿼리가 CPU 사용률을 높이는지 확인

총 CPU 사용률은 선택한 데이터베이스에서 실행된 쿼리가 시간에 따라 수행되는 작업(CPU 초)을 측정합니다.

모든 쿼리의 총 CPU 사용률

그래프를 검토하여 다음 질문을 살펴보세요.

  • 어떤 데이터베이스에서 부하가 발생하나요? 데이터베이스 목록에서 다른 데이터베이스를 선택하여 부하가 가장 높은 데이터베이스를 찾습니다. Google Cloud 콘솔에서 데이터베이스의 CPU 사용률 - 전체 차트를 검토하여 부하가 가장 높은 데이터베이스를 확인할 수도 있습니다.

    데이터베이스 부하

  • CPU 사용률이 높은가요? 시간이 지남에 따라 그래프가 급증하거나 상승했나요? CPU 사용률이 높지 않으면 쿼리에 문제가 없는 것입니다.

  • CPU 사용률이 얼마나 높은가요? 최근에 사용량이 급증했나요? 아니면 한동안 지속적으로 증가했나요? 범위 선택기를 사용하여 여러 기간을 선택해서 문제가 지속된 기간을 확인합니다. 쿼리 부하 급증이 관측된 기간을 확인하려면 화면을 확대합니다. 타임라인을 최대 1주까지 표시하려면 화면을 축소합니다.

전체 인스턴스 CPU 사용량에 해당하는 그래프에서 급증 또는 상승이 표시되는 경우 하나 이상의 비용이 많이 드는 쿼리로 인한 것일 가능성이 높습니다. 그런 다음 문제가 될 수 있는 쿼리 또는 요청 태그를 식별하여 디버깅 여정에 대해 자세히 알아볼 수 있습니다.

잠재적으로 문제가 발생할 수 있는 쿼리 또는 태그 식별

문제가 될 수 있는 쿼리 또는 요청 태그를 식별하려면 TopN 쿼리 섹션을 관찰합니다.

TopN 쿼리

여기서 FPRINT 6815864236081503267을 사용하는 쿼리는 CPU 사용률이 높고 문제가 있을 수 있습니다.

TopN 쿼리 테이블은 선택한 기간 동안 가장 많은 CPU를 사용하는 쿼리에 대한 개요를 제공합니다. TopN 쿼리 수는 100개로 제한됩니다.

그래프에 1분, 10분, 1시간의 세 가지 세부사항이 있는 TopN 쿼리 통계 테이블에서 데이터를 가져옵니다. 그래프의 각 데이터 포인트 값은 1분 간격의 평균 값을 나타냅니다.

SQL 쿼리에 태그를 추가하는 것이 좋습니다. 쿼리 태그 지정은 비즈니스 로직 또는 마이크로서비스 등의 상위 수준 구성에서 문제를 찾는 데 도움이 됩니다.

TopN 쿼리 테이블

테이블에는 다음 속성이 표시됩니다.

  • FPRINT: 요청 태그의 해시(있는 경우)입니다. 그렇지 않은 경우 쿼리의 해시입니다.
  • 쿼리 또는 요청 태그: 쿼리에 연결된 태그가 있는 경우 요청 태그가 표시됩니다. 태그 문자열이 동일한 여러 쿼리의 통계는 해당 태그 문자열과 일치하는 REQUEST_TAG와 함께 단일 행으로 그룹화됩니다. 요청 태그 사용에 대한 자세한 내용은 요청 태그 및 트랜잭션 태그로 문제 해결을 참조하세요.

    쿼리에 연결된 태그가 없으면 약 64KB로 잘린 SQL 쿼리가 표시됩니다. 일괄 DML의 경우 SQL 문은 단일 행으로 평면화되고 세미콜론 구분 기호를 사용하여 연결됩니다. 연속된 동일한 SQL 텍스트는 자르기 전에 중복 삭제됩니다.

  • 쿼리 유형: 쿼리가 PARTITIONED_QUERY 또는 QUERY인지를 나타냅니다. PARTITIONED_QUERYPartitionQuery API에서 가져온 partitionToken이 포함된 쿼리입니다. 다른 모든 쿼리와 DML 문은 QUERY 쿼리 유형으로 표시됩니다.

  • CPU 사용률: 특정 시간 간격 동안 데이터베이스에서 실행되는 모든 쿼리에 사용된 총 CPU 리소스의 비율로, 가로 막대에 0~100 범위로 표시된 쿼리별 CPU 리소스 소비량입니다.

  • CPU(%): 해당 시간 간격 동안 데이터베이스에서 실행되는 모든 쿼리에서 사용된 총 CPU 리소스 비율로, 쿼리별 CPU 리소스 소비량입니다.

  • 실행 횟수: 해당 간격 동안 Spanner가 쿼리를 캡처한 횟수입니다.

  • 평균 지연 시간(밀리초): 데이터베이스 내 각 쿼리 실행의 평균 시간(마이크로초)입니다. 이 평균에서 결과 집합의 인코딩 및 전송 시간과 오버헤드는 제외됩니다.

  • 스캔된 평균 행: 쿼리에서 스캔된 평균 행 수입니다(삭제된 값 제외).

  • 반환된 평균 행: 쿼리에서 반환된 평균 행 수입니다.

  • 반환된 바이트: 쿼리에서 반환된 데이터 바이트 수입니다(전송 인코딩 오버헤드 제외).

그래프 간 가능한 편차

총 CPU 사용률(모든 쿼리) 그래프와 총 CPU 사용률(쿼리 또는 요청 태그당) 그래프가 약간 다를 수 있습니다. 이 시나리오로 이어질 수 있는 두 가지 이유는 다음과 같습니다.

  • 다른 데이터 소스: 총 CPU 사용률(모든 쿼리) 그래프를 공급하는 Cloud Monitoring 데이터는 일반적으로 1분마다 푸시되고 보관 기간이 45일이므로 더 정확합니다. 반면에 총 CPU 사용률(쿼리 또는 요청 태그당) 그래프를 공급하는 시스템 테이블 데이터의 평균이 10분(또는 1시간) 이상일 수 있습니다. 이 경우 총 CPU 사용률(모든 쿼리) 그래프에 표시되는 많은 세부사항 데이터가 손실될 수 있습니다.

  • 다른 집계 기간: 두 그래프 모두 집계 기간이 다릅니다. 예를 들어 6시간보다 오래된 이벤트를 검사할 때는 SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE 테이블을 쿼리합니다. 이 경우 10:01에 발생한 이벤트는 10분 동안 집계되고 10:10 타임스탬프에 해당하는 시스템 테이블에 표시됩니다.

다음 스크린샷은 이러한 분산의 예시를 보여줍니다.

그래프 간 분산

특정 쿼리 또는 요청 태그 분석

쿼리 또는 요청 태그가 문제의 근본 원인인지 확인하려면 부하가 가장 높거나 다른 태그보다 시간이 오래 걸리는 쿼리 또는 요청 태그를 클릭합니다. 한 번에 여러 쿼리를 선택하고 태그를 요청할 수 있습니다.

타임라인에서 쿼리의 그래프 위에 마우스 포인터를 가져가면 CPU 사용률(초)을 알 수 있습니다.

다음을 확인하여 문제의 범위를 좁혀 보세요.

  • 부하는 얼마 동안 높은 상태였나요? 지금 현재만 높나요? 아니면 오랜 기간 동안 높은 상태였나요? 쿼리 성능이 저하된 날짜 및 시간을 찾으려면 기간을 변경합니다.
  • CPU 사용률이 급증했나요? 기간을 변경하여 쿼리의 이전 CPU 사용률을 조사할 수 있습니다.
  • 리소스 소비란 무엇인가요? 다른 쿼리와는 어떤 연관이 있나요? 테이블을 보고 다른 쿼리의 데이터를 선택한 쿼리와 비교합니다. 큰 차이가 있나요?

선택한 쿼리가 CPU 사용률을 높이는지 확인하려면 특정 쿼리 유형(또는 요청 태그)의 세부정보를 드릴다운하고 쿼리 세부정보 페이지에서 자세히 분석하면 됩니다.

쿼리 세부정보 페이지 보기

특정 쿼리 형태 또는 요청 태그의 세부정보를 그래픽 형식으로 보려면 쿼리 또는 요청 태그와 연결된 FPRINT를 클릭합니다. 쿼리 세부정보 페이지가 열립니다.

쿼리 세부정보 페이지

쿼리 세부정보 페이지에는 다음 정보가 표시됩니다.

  1. 쿼리 세부정보 텍스트: SQL 쿼리 텍스트로, 약 64KB 크기로 잘립니다. 태그 문자열이 동일한 여러 쿼리의 통계는 해당 태그 문자열과 일치하는 REQUEST_TAG와 함께 단일 행으로 그룹화됩니다. 이러한 쿼리 중 하나의 텍스트만 이 필드에 표시됩니다. 일괄 DML의 경우 SQL 문 집합이 세미콜론을 사용해 연결된 단일 행으로 평면화됩니다. 연속된 동일한 SQL 텍스트는 자르기 전에 중복 삭제됩니다.
  2. 다음 필드의 값입니다.
    • 실행 횟수: 해당 간격 동안 Spanner가 쿼리를 캡처한 횟수입니다.
    • 평균 CPU(밀리초): 특정 시간 간격에서 인스턴스 CPU 리소스 쿼리에 의한 평균 CPU 리소스 소비(밀리초)입니다.
    • 평균 지연 시간(밀리초): 데이터베이스 내 각 쿼리 실행의 평균 시간(밀리초)입니다. 이 평균에서 결과 집합과 오버헤드의 인코딩 및 전송 시간은 제외됩니다.
    • 반환된 평균 행: 쿼리에서 반환된 평균 행 수입니다.
    • 스캔된 평균 행: 쿼리에서 스캔된 평균 행 수입니다(삭제된 값 제외).
    • 평균 바이트: 쿼리에서 반환된 데이터 바이트 수입니다(전송 인코딩 오버헤드 제외).
  3. 쿼리 계획 샘플 그래프: 그래프의 각 점은 특정 시간에 샘플링된 쿼리 계획과 특정 쿼리 지연 시간을 나타냅니다. 쿼리 계획을 보고 쿼리 실행 중에 수행된 단계를 시각화하려면 그래프의 점 중 하나를 클릭합니다. 참고: 쿼리 계획은 PartitionQuery API 및 Partitioned DML 쿼리에서 가져온 partitionTokens가 있는 쿼리에 지원되지 않습니다.
  4. 쿼리 계획 시각화 도구: 선택한 샘플링된 쿼리 계획을 표시합니다. 그래프의 각 노드 또는 카드는 입력에서 행을 사용하고 상위 행을 생성하는 반복자를 나타냅니다. 각 반복자를 클릭하여 확장된 정보를 볼 수 있습니다.
  5. 쿼리 지연 시간 그래프: 일정 기간 동안 선택한 쿼리에 대한 쿼리 지연 시간 값을 표시합니다. 평균 지연 시간도 보여줍니다.
  6. CPU 사용률 그래프: 일정 기간 동안의 쿼리별 CPU 사용률입니다. 평균 CPU 사용률도 보여줍니다.
  7. 실행 횟수/실패 그래프: 일정 기간 동안 쿼리의 실행 횟수와 쿼리 실행이 실패한 횟수를 표시합니다.
  8. 스캔된 행 그래프: 일정 기간 동안 쿼리가 스캔한 행의 수를 표시합니다.
  9. 반환된 행 그래프: 일정 기간 동안 쿼리가 반환한 행 수를 표시합니다.
  10. 시간 범위 필터: 시간, 일, 커스텀 기간 등 시간 범위별로 쿼리 세부정보를 필터링합니다.

그래프에 1분, 10분, 1시간의 세 가지 세부사항이 있는 TopN 쿼리 통계 테이블에서 데이터를 가져옵니다. 그래프의 각 데이터 포인트 값은 1분 간격의 평균 값을 나타냅니다.