쿼리 통계

Cloud Spanner는 CPU를 가장 많이 사용하는 쿼리와 모든 쿼리의 집계 데이터와 관련된 다양한 통계를 보관하는 테이블을 기본 제공합니다. Google Cloud Console에서는 이러한 SPANNER_SYS.QUERY_STATS* 테이블의 데이터를 사용하여 쿼리 통계 뷰를 생성하지만, 개발자가 SQL 문을 사용하여 테이블에서 통계를 검색할 수도 있습니다.

사용량

SPANNER_SYS 데이터는 SQL 인터페이스를 통해서만 사용할 수 있습니다(예: executeQuerygcloud spanner databases execute-sql). Cloud Spanner의 다른 단일 읽기 메서드는 SPANNER_SYS를 지원하지 않습니다.

쿼리별로 그룹화된 CPU 사용량

다음 테이블은 특정 기간 동안 CPU 사용량이 가장 높은 쿼리를 추적합니다.

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE: 1분 간격 동안의 쿼리
  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE: 10분 간격 동안의 쿼리
  • SPANNER_SYS.QUERY_STATS_TOP_HOUR: 1시간 간격 동안의 쿼리

이러한 테이블에는 다음과 같은 속성이 있습니다.

  • 각 테이블에는 테이블 이름에 지정된 길이의 겹치지 않는 시간 간격에 대한 데이터가 포함되어 있습니다.

  • 간격은 시계 시간을 기준으로 합니다. 1분 간격은 매분 정각에 끝나고, 10분 간격은 매시 정각에 시작해서 10분 단위로 끝나며, 1시간 간격은 매시 정각에 끝납니다.

    예를 들어 오전 11:59:30에 SQL 쿼리에 사용할 수 있는 가장 최근 간격은 다음과 같습니다.

    • 1분: 오전 11:58:01~11:59:00
    • 10분: 오전 11:40:01~11:50:00
    • 1시간: 오전 10:00:01~11:00:00
  • Cloud Spanner는 SQL 쿼리의 텍스트를 기준으로 통계를 그룹화합니다. 쿼리에 쿼리 매개변수가 사용된 경우 Cloud Spanner는 해당 쿼리의 모든 실행을 하나의 행으로 그룹화합니다. 쿼리에 문자열 리터럴이 사용된 경우 Cloud Spanner는 전체 쿼리 텍스트가 동일할 때만 통계를 그룹화하므로 다른 텍스트가 있으면 각 쿼리가 개별 행으로 표시됩니다.

  • 각 행에는 Cloud Spanner가 지정된 간격 동안 통계를 캡처하는 특정 SQL 쿼리의 모든 실행에 대한 통계가 포함됩니다.

  • Cloud Spanner가 특정 간격 동안 실행된 모든 쿼리를 저장할 수 없는 경우에는 지정된 간격 동안 CPU 사용량이 가장 높은 쿼리부터 우선적으로 저장됩니다.

테이블 스키마

열 이름 유형 설명
INTERVAL_END TIMESTAMP 포함된 쿼리 실행이 발생한 시간 간격의 끝입니다.
TEXT STRING SQL 쿼리 텍스트로, 약 64KB 크기로 잘립니다.
TEXT_TRUNCATED BOOL 쿼리 텍스트가 잘렸는지 여부입니다.
TEXT_FINGERPRINT INT64 쿼리 텍스트의 해시입니다.
EXECUTION_COUNT INT64 해당 간격 동안 Cloud Spanner가 쿼리를 캡처한 횟수입니다.
AVG_LATENCY_SECONDS FLOAT64 데이터베이스 내 각 쿼리 실행의 평균 시간(초)입니다. 이 평균에서 결과 집합의 인코딩 및 전송 시간과 오버헤드는 제외됩니다.
AVG_ROWS FLOAT64 쿼리에서 반환된 평균 행 수입니다.
AVG_BYTES FLOAT64 쿼리에서 반환된 평균 데이터 바이트 수입니다(전송 인코딩 오버헤드 제외).
AVG_ROWS_SCANNED FLOAT64 쿼리에서 스캔된 평균 행 수입니다(삭제된 값 제외).
AVG_CPU_SECONDS FLOAT64 Cloud Spanner가 쿼리를 실행하기 위해 모든 작업에 소비한 평균 CPU 시간(초)입니다.

집계 통계 테이블

특정 기간 동안 Cloud Spanner가 통계를 캡처한 모든 쿼리에 대한 집계 데이터를 추적하는 테이블도 있습니다.

  • SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: 1분 간격 동안의 쿼리
  • SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: 10분 간격 동안의 쿼리
  • SPANNER_SYS.QUERY_STATS_TOTAL_HOUR: 1시간 간격 동안의 쿼리

이러한 테이블에는 다음과 같은 속성이 있습니다.

  • 각 테이블에는 테이블 이름에 지정된 길이의 겹치지 않는 시간 간격에 대한 데이터가 포함되어 있습니다.

  • 간격은 시계 시간을 기준으로 합니다. 1분 간격은 매분 정각에 끝나고, 10분 간격은 매시 정각에 시작해서 10분 단위로 끝나며, 1시간 간격은 매시 정각에 끝납니다.

    예를 들어 오전 11:59:30에 SQL 쿼리에 사용할 수 있는 가장 최근 간격은 다음과 같습니다.

    • 1분: 오전 11:58:01~11:59:00
    • 10분: 오전 11:40:01~11:50:00
    • 1시간: 오전 10:00:01~11:00:00
  • 각 행에는 지정된 간격 동안 데이터베이스에 대해 실행된 모든 쿼리에 대한 통계가 함께 집계됩니다. 따라서 시간 간격당 하나의 행만 있습니다.

  • TOTAL 테이블에 캡처되는 통계에는 Cloud Spanner가 TOP 테이블에 캡처하지 않은 쿼리도 포함될 수 있습니다.

테이블 스키마

열 이름 유형 설명
INTERVAL_END TIMESTAMP 포함된 쿼리 실행이 발생한 시간 간격의 끝입니다.
EXECUTION_COUNT INT64 해당 시간 간격 동안 Cloud Spanner가 쿼리를 캡처한 횟수입니다.
AVG_LATENCY_SECONDS FLOAT64 데이터베이스 내 각 쿼리 실행의 평균 시간(초)입니다. 이 평균에서 결과 집합의 인코딩 및 전송 시간과 오버헤드는 제외됩니다.
AVG_ROWS FLOAT64 쿼리에서 반환된 평균 행 수입니다.
AVG_BYTES FLOAT64 쿼리에서 반환된 평균 데이터 바이트 수입니다(전송 인코딩 오버헤드 제외).
AVG_ROWS_SCANNED FLOAT64 쿼리에서 스캔된 평균 행 수입니다(삭제된 값 제외).
AVG_CPU_SECONDS FLOAT64 Cloud Spanner가 쿼리를 실행하기 위해 모든 작업에 소비한 평균 CPU 시간(초)입니다.

데이터 보관

Cloud Spanner는 각 테이블의 데이터를 최소한 다음 기간 동안 보관합니다.

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTESPANNER_SYS.QUERY_STATS_TOTAL_MINUTE: 이전 6시간을 포함하는 간격

  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTESPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE: 이전 4일을 포함하는 간격

  • SPANNER_SYS.QUERY_STATS_TOP_HOURSPANNER_SYS.QUERY_STATS_TOTAL_HOUR: 이전 30일을 포함하는 간격

쿼리 예시

이 섹션에는 쿼리 통계를 검색하는 SQL 문의 몇 가지 예시가 포함되어 있습니다. 이러한 SQL 문은 클라이언트 라이브러리, gcloud 명령줄 도구 또는 Cloud Console을 사용하여 실행할 수 있습니다.

일정 기간 동안 각 쿼리의 기본 통계 나열

다음 쿼리는 이전 1분 동안의 상위 쿼리에 대한 원시 데이터를 반환합니다.

SELECT text,
       interval_end,
       execution_count,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
ORDER BY interval_end;

CPU 사용량이 가장 높은 쿼리 나열

다음 쿼리는 이전 1시간 동안 CPU 사용량이 가장 높은 쿼리를 반환합니다.

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

일정 기간 동안의 총 실행 횟수 확인

다음 쿼리는 가장 최근의 1분 간격 동안 실행된 쿼리의 총 수를 반환합니다.

SELECT interval_end,
       execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute)
ORDER BY interval_end;

쿼리의 평균 지연 시간 확인

다음 쿼리는 특정 쿼리의 평균 지연 시간 정보를 반환합니다.

SELECT avg_latency_seconds
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "SELECT x FROM table WHERE x=@foo;";

가장 많은 데이터를 검색한 쿼리 확인

쿼리에서 스캔된 행의 개수를 사용하여 쿼리에서 스캔된 데이터의 양을 측정할 수 있습니다. 다음 쿼리는 이전 1시간 동안 실행된 쿼리에서 스캔된 행의 개수를 반환합니다.

SELECT text,
       execution_count,
       avg_rows_scanned
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_scanned DESC;

모든 쿼리의 CPU 사용량 합계 확인

다음 쿼리는 이전 1시간 동안 사용된 CPU 시간 수를 반환합니다.

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.query_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_total_hour);

다음 단계