테이블 작업 통계

Spanner는 테이블(변경 내역 테이블 포함) 및 색인에 대한 읽기(또는 쿼리), 쓰기, 삭제 작업 통계를 기록하는 기본 제공 테이블을 제공합니다. 테이블 작업 통계로 다음을 수행할 수 있습니다.

  • 스토리지 증가에 따라 쓰기 트래픽이 증가한 테이블을 식별합니다.

  • 예기치 않은 읽기, 쓰기, 삭제 트래픽이 있는 테이블을 식별합니다.

  • 많이 사용되는 테이블을 식별합니다.

테이블에 쿼리하거나 쓰는 경우 액세스된 행 수에 관계없이 테이블의 해당 작업 수는 1씩 증가합니다.

시스템 통계 차트의 Operations per second, Operations per second by API method, 기타 관련 측정항목을 사용하여 데이터베이스의 전체 초당 작업 측정항목을 모니터링할 수 있습니다.

가용성

Spanner는 SPANNER_SYS 스키마에서 테이블 작업 통계를 제공합니다. SPANNER_SYS 데이터는 SQL 인터페이스를 통해서만 사용할 수 있습니다. 예를 들면 다음과 같습니다.

  • Google Cloud 콘솔에 있는 데이터베이스의 Spanner 스튜디오 페이지

  • gcloud spanner databases execute-sql 명령어

  • executeQuery API

Spanner가 제공하는 다른 단일 읽기 메서드는 SPANNER_SYS를 지원하지 않습니다.

테이블 작업 통계

다음 테이블은 특정 기간 동안 테이블과 색인의 읽기(또는 쿼리), 쓰기, 삭제 통계를 추적합니다.

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE: 1분 간격 동안의 작업
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE: 10분 간격 동안의 작업
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR: 1시간 간격 동안의 작업

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

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

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

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

    • 1분: 오전 11:58:00–11:58:59
    • 10분: 오전 11:40:00–11:49:59
    • 1시간: 오전 10:00:00~10:59:59

모든 테이블 작업 통계 테이블의 스키마

열 이름 유형 설명
INTERVAL_END TIMESTAMP 테이블 크기가 수집된 종료 시간 간격입니다.
TABLE_NAME STRING 테이블 또는 색인의 이름입니다.
READ_QUERY_COUNT INT64 테이블에서 읽는 쿼리 또는 읽기 수입니다.
WRITE_COUNT INT64 테이블에 쓰는 쿼리 수입니다.
DELETE_COUNT INT64 테이블에서 삭제를 수행하는 쿼리 수입니다.

변형을 사용하여 데이터베이스에 데이터를 삽입하면 write_count에서 삽입 문으로 액세스되는 테이블마다 1씩 증가합니다. 또한 기본 테이블을 스캔하지 않고 색인에 액세스하는 쿼리는 색인에서 read_query_count만 증가합니다.

데이터 보관

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

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE: 지난 6시간을 포함하는 간격

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE:지난 4일을 포함하는 간격

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR: 지난 30일을 포함하는 간격

쿼리 예시

이 섹션에는 집계 테이블 작업 통계를 검색하는 SQL 문의 몇 가지 예시가 포함되어 있습니다. 클라이언트 라이브러리 또는 gcloud spanner를 사용하여 이러한 SQL 문을 실행할 수 있습니다.

가장 최근 간격 동안 쓰기 작업이 가장 많은 테이블 및 색인 쿼리

    SELECT interval_end,
          table_name,
          write_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY write_count DESC;
  

가장 최근 간격 동안 삭제 작업이 가장 많은 테이블 및 색인 쿼리

    SELECT interval_end,
          table_name,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY delete_count DESC;
  

가장 최근 간격 동안 읽기 및 쿼리 작업이 가장 많은 테이블 및 색인 쿼리

    SELECT interval_end,
          table_name,
          read_query_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY read_query_count DESC;
  

지난 6시간 동안의 테이블 사용량 쿼리

    SELECT interval_end,
           read_query_count,
           write_count,
           delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE table_name = table_name
    ORDER BY interval_end DESC;
    

각 항목의 의미는 다음과 같습니다.

  • table_name은 데이터베이스의 기존 테이블 또는 색인이어야 합니다.

지난 14일 동안의 테이블 사용량 쿼리

GoogleSQL

SELECT interval_end,
       read_query_count,
       write_count,
       delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = table_name
ORDER BY interval_end DESC;

각 항목의 의미는 다음과 같습니다.

  • table_name은 데이터베이스의 기존 테이블 또는 색인이어야 합니다.

지난 24시간 동안 사용량이 없는 테이블 및 색인 쿼리

GoogleSQL

(SELECT t.table_name
 FROM  information_schema.tables AS t
 WHERE t.table_catalog = ""
   AND t.table_schema = ""
   AND t.table_type = "BASE TABLE"
 UNION ALL
 SELECT cs.change_stream_name
 FROM information_schema.change_streams cs
 WHERE cs.change_stream_catalog = ""
   AND cs.change_stream_schema = ""
 UNION ALL
 SELECT idx.index_name
 FROM information_schema.indexes idx
 WHERE idx.index_type = "INDEX"
   AND idx.table_catalog = ""
   AND idx.table_schema = "")
 EXCEPT ALL
(SELECT  DISTINCT(table_name)
 FROM spanner_sys.table_operations_stats_hour
 WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR));

다음 단계