Spanner는 테이블 열에 대한 읽기, 쿼리, 쓰기 작업 통계를 기록하는 기본 제공 테이블을 제공합니다. 열 작업 통계로 다음을 수행할 수 있습니다.
- 예기치 않은 읽기, 쿼리, 쓰기 트래픽이 있는 열을 식별합니다. 
- 많이 사용되는 열을 식별합니다. 
열에 쿼리하거나 쓰는 경우 액세스된 행 수에 관계없이 해당 열의 작업 수가 1씩 증가합니다.
시스템 통계 차트에서 초당 작업 수, API 메서드별 초당 작업 수, 기타 관련 측정항목을 측정하는 측정항목을 사용하여 데이터베이스의 전반적인 사용량을 모니터링할 수 있습니다.
열 작업 통계 액세스
Spanner는 SPANNER_SYS 스키마에서 열 작업 통계를 제공합니다. 다음을 사용하여 SPANNER_SYS 데이터에 액세스할 수 있습니다.
- Google Cloud 콘솔에 있는 데이터베이스의 Spanner Studio 페이지 
- executeSql또는- executeStreamingSql메서드
Spanner가 제공하는 다음 단일 읽기 메서드는 SPANNER_SYS를 지원하지 않습니다.
- 테이블의 단일 행 또는 여러 행에서 강력 읽기 수행
- 테이블의 단일 행 또는 여러 행에서 비활성 읽기 수행
- 보조 색인의 단일 행 또는 여러 행에서 읽기
자세한 내용은 단일 읽기 메서드를 참고하세요.
열 작업 통계
다음 표는 특정 기간 동안 열의 읽기, 쿼리, 쓰기 통계를 추적합니다.
- SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE: 1분 간격 동안의 작업
- SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE: 10분 간격 동안의 작업
- SPANNER_SYS.COLUMN_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 | 테이블 또는 색인의 이름입니다. | 
| COLUMN_NAME | STRING | 열 이름입니다. | 
| READ_COUNT | INT64 | 열에서 읽은 횟수입니다. | 
| QUERY_COUNT | INT64 | 열에서 읽는 쿼리 수입니다. | 
| WRITE_COUNT | INT64 | 테이블에 쓰는 쿼리 수입니다. | 
| IS_QUERY_CACHE_MEMORY_CAPPED | BOOL | 메모리 부족으로 인해 통계 수집이 제한되었는지 여부입니다. | 
변형을 사용하여 데이터베이스에 데이터를 삽입하면 Spanner는 삽입 문으로 액세스되는 테이블마다 WRITE_COUNT를 1씩 증가시킵니다. 또한 기본 테이블을 스캔하지 않고 색인에 액세스하는 쿼리는 색인에서 QUERY_COUNT만 증가합니다.
데이터 보관
Spanner는 각 테이블의 데이터를 최소한 다음 기간 동안 보관합니다.
- SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE: 이전 6시간을 포함하는 간격
- SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE: 지난 4일을 포함하는 간격
- SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR: 지난 30일을 포함하는 간격
쿼리 예
이 섹션에는 집계 열 작업 통계를 검색하는 SQL 문의 몇 가지 예시가 포함되어 있습니다. 클라이언트 라이브러리 또는 Google Cloud CLI를 사용하여 이러한 SQL 문을 실행할 수 있습니다.
가장 최근 간격 동안 쓰기 작업이 가장 많은 테이블 열 쿼리
GoogleSQL
SELECT interval_end, table_name, column_name, write_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY write_count DESC;
PostgreSQL
SELECT interval_end, table_name, column_name, write_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY write_count DESC;
가장 최근 간격 동안 쿼리 작업이 가장 많은 열 쿼리
GoogleSQL
SELECT interval_end, table_name, column_name, query_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY query_count DESC;
PostgreSQL
SELECT interval_end, table_name, column_name, query_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY query_count DESC;
지난 6시간 동안의 열 사용량 쿼리
GoogleSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_minute WHERE table_name = "table_name" AND column_name = "column_name" ORDER BY interval_end DESC;
각 항목의 의미는 다음과 같습니다.
- table_name은 데이터베이스의 기존 테이블 또는 색인이어야 합니다.
- column_name은 테이블의 기존 열이어야 합니다.
PostgreSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_minute WHERE table_name = 'table_name' AND column_name = 'column_name' ORDER BY interval_end DESC;
각 항목의 의미는 다음과 같습니다.
- table_name은 데이터베이스의 기존 테이블 또는 색인이어야 합니다.
- column_name은 테이블의 기존 열이어야 합니다.
지난 14일 동안의 열 사용량 쿼리
GoogleSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_hour WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY) AND table_name = "table_name" AND column_name = "column_name" ORDER BY interval_end DESC;
다음을 바꿉니다.
- table_name: 데이터베이스의 테이블 또는 색인 이름입니다.
- column_name: 테이블의 열 이름입니다.
PostgreSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_hour WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY') AND table_name = 'table_name' AND column_name = 'column_name' ORDER BY interval_end DESC;
다음을 바꿉니다.
- table_name: 데이터베이스의 테이블 또는 색인 이름입니다.
- column_name: 테이블의 열 이름입니다.
다음 단계
- 다른 기본 제공 통계 테이블에 대해 알아봅니다. 
- Spanner 관련 SQL 권장사항에 대해 자세히 알아보기