활성 Partitioned DML 통계

활성 Partitioned DML은 데이터베이스에서 현재 활성화된 Partitioned DML의 실시간 진행 상태를 제공합니다.

Spanner는 실행 중인 Partitioned DML과 진행 상태를 나열하는 기본 제공 테이블인 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS를 제공합니다.

이 문서에서는 테이블을 자세히 설명하고, 이 테이블을 사용하는 몇 가지 쿼리 예시를 보여주고, 마지막으로 이러한 쿼리를 사용하여 활성 Partitioned DML로 인해 발생하는 문제를 완화하는 방법을 보여줍니다.

사용 가능 여부

SPANNER_SYS 데이터는 SQL 인터페이스를 통해서만 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS는 시작 시간을 기준으로 정렬된 활성 Partitioned DML의 목록을 반환합니다.

테이블 스키마

다음은 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS의 테이블 스키마입니다.

열 이름 유형 설명
TEXT STRING Partitioned DML 쿼리 문 텍스트입니다.
TEXT_FINGERPRINT INT64 디지털 지문은 Partitioned DML 텍스트의 해시입니다.
SESSION_ID STRING Partitioned DML을 실행하는 세션의 ID입니다. 세션 ID를 삭제하면 쿼리가 취소됩니다.
NUM_PARTITIONS_TOTAL INT64 Partitioned DML의 총 파티션 수입니다.
NUM_PARTITIONS_COMPLETE INT64 Partitioned DML이 완료한 파티션 수입니다.
NUM_TRIVIAL_PARTITIONS_COMPLETE INT64 처리된 행이 없는 전체 파티션 수입니다.
PROGRESS DOUBLE Partitioned DML의 진행률은 완료된 주요 파티션 수를 주요 파티션의 총 개수로 나누어 계산합니다.
ROWS_PROCESSED INT64 지금까지 처리된 행 수로, 각 파티션이 완료된 후 업데이트됩니다.
START_TIMESTAMP TIMESTAMP Partitioned DML의 시작 시간에 대한 상한값입니다.
LAST_UPDATE_TIMESTAMP TIMESTAMP Partitioned DML이 진행된 마지막 타임스탬프입니다. 파티션이 완료된 후 업데이트됩니다.

쿼리 예

클라이언트 라이브러리, Google Cloud CLI 또는Google Cloud 콘솔을 사용하여 다음 SQL 문 예시를 실행할 수 있습니다.

가장 오래 실행 중인 쿼리 나열

다음 쿼리는 실행 중인 Partitioned DML의 목록을 쿼리 시작 시간을 기준으로 정렬하여 반환합니다.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC;
text session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete progress rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024-01-21 15:56:30.498744-08:00 2024-01-22 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00.00% 0 2024-01-22 15:55:18.498744-08:00 2024-01-22 15:56:28.049799-08:00
DELETE from Singers WHERE SingerId > 1000000 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20.00% 238654 2024-01-22 15:56:30.498744-08:00 2024-01-22 15:56:19.049799-08:00
UPDATE Singers SET MarketingBudget = 1000 WHERE true 036097a9-91d4-566a-a399-20c754eabdc2 8 5 0 62.50% 238654 2024-01-22 15:57:47.498744-08:00 2024-01-22 15:57:39.049799-08:00

제한사항

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS 테이블을 사용할 때는 다음과 같은 제한사항이 있습니다.

  • PROGRESS, ROWS_PROCESSED, LAST_UPDATE_TIMESTAMP 결과는 완료된 파티션 경계에서 증분되므로 이러한 세 필드의 값을 그대로 유지하면서 Partitioned DML이 행을 계속 업데이트할 수 있습니다.

  • Partitioned DML의 파티션이 수백만 개 있는 경우 PROGRESS 열의 값이 모든 증분 진행 상태를 캡처하지 못할 수 있습니다. NUM_PARTITIONS_COMPLETENUM_TRIVIAL_PARTITIONS_COMPLETE를 사용하여 더 세부적인 진행 상태를 참조하세요.

  • RPC 요청을 사용하여 Partitioned DML을 취소하면 취소된 Partitioned DML이 테이블에 계속 표시될 수 있습니다. 세션 삭제를 사용하여 Partitioned DML을 취소하면 테이블에서 즉시 삭제됩니다. 자세한 내용은 세션 ID 삭제를 참조하세요.

활성 Partitioned DML 쿼리 데이터를 사용하여 높은 CPU 사용률 문제 해결

쿼리 통계트랜잭션 통계는 Spanner 데이터베이스의 지연 시간 문제를 해결할 때 유용한 정보를 제공합니다. 이러한 도구는 이미 완료된 쿼리에 대한 정보를 제공합니다. 하지만 시스템에서 현재 실행 중인 항목에 대한 정보가 필요한 경우도 있습니다. 예를 들어 CPU 사용률이 높고 다음과 같은 질문에 대한 답을 확인해야 하는 시나리오를 가정해보세요.

  • 현재 실행 중인 Partitioned DML은 몇 개인가요?
  • 이러한 Partitioned DML은 무엇인가요?
  • Partitioned DML 중에서 몇 개가 장시간 실행 중인가요?
  • 쿼리를 실행 중인 세션은 무엇인가요?

위와 같은 질문이 해결되면 다음 조치를 취하도록 결정할 수 있습니다.

  • 즉시 해결을 위해 쿼리를 실행하는 세션을 삭제합니다.
  • Partitioned DML의 빈도를 줄입니다.

다음 둘러보기에서는 활성 Partitioned DML을 조사하면서 취할 조치가 있는지 여부를 판단합니다.

활성 Partitioned DML 요약 검색

이 시나리오 예시에서는 CPU 사용량이 정상치보다 높다고 확인되므로 다음 쿼리를 실행하여 활성 Partitioned DML의 수를 반환하기로 결정합니다.

SELECT count(*) as active_count
FROM spanner_sys.active_partitioned_dmls;

이 쿼리는 다음과 같은 결과를 반환합니다.

active_count
22

가장 오래 실행 중인 상위 2개 Partitioned DML 나열

그런 다음 쿼리를 실행하여 Partitioned DML의 시작 시간을 기준으로 정렬했을 때 가장 오래 실행 중인 상위 2개 Partitioned DML을 자세히 확인할 수 있습니다.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC LIMIT 2;
text session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete progress rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024-01-21 15:56:30.498744-08:00 2024-01-22 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00.00% 0 2024-01-22 15:55:18.498744-08:00 2024-01-22 15:56:28.049799-08:00

고비용 쿼리 취소

Partitioned DML이 며칠 동안 실행되었지만 진행되지 않은 것으로 확인되었습니다. 따라서 다음 gcloud spanner databases sessions delete 명령어로 세션 ID를 사용하여 세션을 삭제하면 Partitioned DML이 취소됩니다.

gcloud spanner databases sessions delete\
   5bd37a99-200c-5d2e-9021-15d0dbbd97e6 \
    --database=singer_db --instance=test-instance

다음 단계

  • 다른 점검 도구 알아보기
  • Spanner가 각 데이터베이스에 대해 데이터베이스의 정보 스키마 테이블에 저장하는 다른 정보 알아보기
  • Spanner 관련 SQL 권장사항에 대해 자세히 알아보기