내용으로 건너뛰기

Amazon Redshift에서 VACUUM과 관련된 문제를 해결하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Redshift 클러스터에서 VACUUM 성능 관련 문제가 있습니다. 또는 Amazon Redshift 클러스터에서 VACUUM 쿼리가 실패합니다.

간략한 설명

VACUUM은 리소스를 많이 사용하는 작업이며 다음과 같은 이유로 속도가 느려질 수 있습니다.

  • 정렬되지 않은 데이터의 높은 비율
  • 열이 너무 많이 있는 대규모 테이블
  • 인터리브 정렬 키 사용
  • VACUUM의 불규칙한 사용 또는 낮은 사용 빈도
  • 동시 테이블, 클러스터 쿼리, DDL 문 또는 ETL 작업

svv_vacuum_progress 쿼리를 사용하여 VACUUM 작업의 상태와 세부 정보를 확인하십시오. 그런 다음, VACUUM 모범 사례에 따라 문제를 해결하고 향후 문제를 방지하십시오.

해결 방법

VACUUM 성능 문제 해결

참고: 다음은 프로비저닝된 Amazon Redshift 클러스터에 적용됩니다. 다음 시스템 테이블 및 쿼리는 Amazon Redshift Serverless에서 작동하지 않습니다.

VACUUM 작업이 진행 중인지 확인하려면 svv_vacuum_progress 쿼리를 실행하십시오.

dev=# SELECT * FROM svv_vacuum_progress;
table_name |          status                 | time_remaining_estimate
-----------+---------------------------------+-------------------------
 data8     |  Vacuum: initialize merge data8 | 4m 55s
(1 row)

svv_vacuum_progress 쿼리에는 테이블 이름, 정리 상태 및 완료까지 남은 예상 시간도 포함됩니다. VACUUM이 실행되고 있지 않은 경우 svv_vacuum_progress 쿼리는 마지막으로 실행된 VACUUM의 상태를 보여줍니다.

참고: svv_vacuum_progress 쿼리는 한 행의 결과만 반환합니다.

정리 중인 테이블의 세부 사항을 확인하십시오. WHERE 절에 테이블 및 스키마 이름을 지정합니다.

SELECT schema, table_id, "table", diststyle, sortkey1, sortkey_num, unsorted, tbl_rows, estimated_visible_rows, stats_off
FROM svv_table_info
WHERE "table" IN ('data8');

출력 예시:

Schema     | table_id | table | diststyle | sortkey1 | sortkey_num | unsorted | tbl_rows  | est_visible_rows | stats_off
------------+----------+-------+-----------+----------+-------------+----------+-----------+------------------+-----------
testschema | 977719   | data8 | EVEN      | order_id |  2          |    25.00 | 755171520 | 566378624        | 100.00

위 출력에서 sortkey1 열에는 기본 정렬 키가 표시됩니다.

테이블에 인터리브 정렬 키가 있으면 이 열에는 INTERLEAVED 상태가 표시됩니다.

  • sortkey_num 열에는 정렬 키의 열 수가 표시됩니다.
  • unsorted 열에는 정렬해야 하는 행의 백분율이 표시됩니다.
  • tbl_rows 열에는 삭제된 행과 업데이트된 행을 포함한 전체 행 수가 표시됩니다.
  • estimated_visible_rows는 삭제된 행을 제외한 행 수입니다.
  • 완전히 정리(삭제 및 정렬)한 후에는 tbl_rows 및 estimated_visible_rows의 값이 서로 비슷해지고 unsorted 값은 0에 도달합니다. 참고: 테이블의 데이터는 실시간으로 업데이트됩니다. VACUUM의 진행 상황을 확인하려면 쿼리를 계속 실행합니다. VACUUM이 진행됨에 따라 정렬되지 않은 행이 점차 감소한다는 점에 유의하십시오. 정렬되지 않은 데이터의 비율이 높은지 확인하려면 특정 테이블의 VACUUM 정보를 확인하십시오.

테이블의 VACUUM 정보를 확인하려면 다음 쿼리를 실행하십시오. 이전 쿼리의 테이블 ID를 지정합니다.

SELECT table_id, status, rows, sortedrows, blocks, eventtime
FROM stl_vacuum
WHERE table_id=977719
ORDER BY eventtime DESC LIMIT 20;

출력 예시:

table_id |             status             |    rows    | sortedrows | blocks |         eventtime
         ----------+--------------------------------+------------+------------+--------+----------------------------
  977719 | [VacuumBG] Finished            |  566378640 |          0 |  23618 | 2020-05-27 06:55:33.232536
  977719 | [VacuumBG] Started Delete Only | 1132757280 |  566378640 |  47164 | 2020-05-27 06:55:18.906008
  977719 | Finished                       |  566378640 |  566378640 |  23654 | 2020-05-27 06:46:04.086842
  977719 | Started                        | 1132757280 |  566378640 |  45642 | 2020-05-27 06:28:17.128345
(4 rows)

위 예제에서 출력은 최신 이벤트를 먼저 나열한 다음, 이전 이벤트를 정렬된 순서로 나열합니다.

  • 마지막 VACUUM은 2020-05-27 06:55:18.906008 UTC에 시작되고 몇 초 안에 완료된 자동 VACUUM DELETE입니다.
  • 이 VACUUM은 삭제된 행이 차지한 공간을 해제했습니다. 이 상태는 VACUUM 작업이 시작되고 완료될 때 표시되는 행 및 블록 수로 확인됩니다.

VACUUM의 시작 및 완료에서 테이블이 차지하는 블록 수의 변화에 주의하십시오.

참고: Amazon Redshift는 백그라운드로 테이블에 대한 VACUUM SORT 및 VACUUM DELETE 작업을 자동으로 수행합니다. 이러한 백그라운드 VACUUM은 부하가 감소된 기간에 실행되고 부하가 높은 기간에는 일시 중지됩니다. 이 자동 VACUUM을 사용하면 VACUUM 명령을 실행해야 할 필요성이 줄어듭니다.

sortedrows 열에는 테이블의 정렬된 행 수가 표시됩니다. 자동 VACUM DELETE 작업이므로 마지막 VACUUM에서는 정렬이 수행되지 않았습니다. 활성 행이 정렬되지 않았으므로 삭제로 표시된 행에는 VACUUM이 시작되었을 때와 동일한 수의 정렬된 행이 표시됩니다. VACUUM DELETE가 완료되면 0개의 정렬된 행이 표시됩니다.

2020-05-27 06:28:17.128345 UTC에 시작된 초기 VACUUM은 완전한 VACUUM을 보여줍니다. 프로세스는 약 18분 후에 삭제된 행과 정렬된 행에서 공간을 확보했습니다. VACUUM 작업이 완료되면 VACUUM이 행을 성공적으로 정렬했기 때문에 출력에는 rows 및 sortedrows에 동일한 값이 표시됩니다.

이미 진행 중인 VACUUM의 경우 성능을 계속 모니터링하고 모범 사례를 적용하십시오.

VACUUM 실패 문제 해결

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

VACUUM 쿼리가 실패한 이유를 알아보려면 SYS_QUERY_HISTORY 또는 STL_QUERY를 사용하여 오류 메시지를 확인하십시오.

STL_QUERY를 사용하는 경우에는 STL_ERROR에서 오류 세부 정보를 가져와야 합니다. STL_ERROR에는 쿼리 ID 열이 없으므로 STL_QUERY에서 PID 필드를 찾으십시오. 그런 다음, STL_ERROR 쿼리에서 해당 필드를 사용하십시오.

예:

SELECT user_id, query_id, transaction_id, session_id,  status, start_time, end_time, execution_time, error_message FROM sys_query_history WHERE query_id IN (<failed queries>)


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

| user_id | query_id   | transaction_id |  session_id | status | start_time              |     end_time                  |  execution_time |   error_message |  
| 100        | 915082632 | 35599398     | 1096641177 | failed  | 2024-10-06 21:09:30.209587 | 2024-10

실행 문을 사용하여 VACUUM 쿼리를 실행하는 경우 describe-statement를 사용하여 오류 메시지를 확인하십시오.

예:

aws redshift-data describe-statement --id 7c823348d-be8b-437a-9a0-db8c0ca44f0f
{
    "ClusterIdentifier": "redshift-cluster-1",
    "CreatedAt": "2024-10-07T16:25:27.566000+00:00",
    "Duration": -1,
    "Error": "ERROR: VACUUM cannot run inside a multiple commands statement",
    "HasResultSet": false,
    "Id": "7c823348d-be8b-437a-9a0-db8c0ca44f0f",
    "QueryString": "vacuum full toptem;\nvacuum full tsupport;\nvacuum full supplierxbox;\nvacuum full party;",
    "RedshiftPid": 10723479554,
    "RedshiftQueryId": 42304,
    "ResultRows": -1,
    "ResultSize": -1,
    "Status": "FAILED",
    "UpdatedAt": "2024-10-07T16:25:33.566000+00:00"
}

VACUUM 모범 사례

다음과 같은 모범 사례를 통해 VACUUM 성능을 개선할 수 있습니다.

  • VACUUM은 리소스를 많이 사용하는 작업이므로 사용량이 적은 시간에 실행합니다.
  • 사용량이 적은 시간에는 VACUUM 작업에 대해 wlm_query_slot_count를 사용하여 대기열의 동시성 수준을 일시적으로 재정의합니다.
  • 대규모 테이블의 경우 최대 99%의 임계값 파라미터로 VACUUM 작업을 실행합니다.
  • VACUUM 실행의 적절한 임계값 및 빈도를 결정합니다. 예를 들어 VACUUM을 100% 임계값에서 실행하거나 데이터를 항상 정렬하고 싶을 수 있습니다. Amazon Redshift 클러스터의 쿼리 성능을 최적화하는 접근 방식을 사용하십시오.
  • 정렬되지 않은 많은 영역이 대규모 테이블에 누적되지 않을 정도로만 VACUUM FULL 또는 VACUUM SORT ONLY를 실행합니다.
  • 대규모 테이블에 정렬되지 않은 데이터가 많으면 전체 복사를 수행합니다. 전체 복사를 사용하면 기존 테이블에서 VACUUM SORT를 실행하는 대신 새 테이블에 데이터를 로드할 수 있습니다.
  • BOOST 옵션을 사용하여 VACUUM 명령을 실행합니다. BOOST 옵션은 사용 가능한 메모리 및 디스크 공간과 같은 추가 리소스를 VACUUM에 할당합니다. BOOST 옵션을 사용하면 VACUUM이 하나의 창에서 작동하고 VACUUM 작업 기간 동안 동시 삭제 및 업데이트를 차단합니다.
    참고: BOOST 옵션과 함께 VACUUM을 실행하면 쿼리 성능에 영향을 줄 수 있습니다. VACUUM BOOST 작업은 유지 보수 작업 중이나 사용량이 적은 시간에만 실행하는 것이 좋습니다.
  • 대규모 테이블을 시계열 테이블로 분할하면 VACUUM 성능이 향상됩니다. 경우에 따라 시계열 테이블을 사용하면 VACUUM을 실행하는 데 필요한 요구 사항을 충족할 수 있습니다.
  • 대규모 테이블에 대한 열 압축 유형을 선택합니다. 압축된 행은 데이터를 정렬할 때 디스크 공간을 덜 사용합니다.
  • VACUUM 작업 후 ANALYZE 명령을 사용하여 통계를 업데이트합니다. 쿼리 플래너는 이러한 값을 사용하여 최적의 계획을 선택합니다.
  • 클러스터가 완전히 유휴 상태인 경우 VACUUM 시도에 실패한 경우 MANUAL VACUUM을 실행합니다. 자세한 내용은 수동으로 테이블 정리 및 분석을 참조하십시오.

관련 정보

STL_ERROR

Amazon Redshift에서 쿼리가 취소된 이유는 무엇인가요?

Amazon Redshift Serverless 쿼리가 취소 또는 중지된 이유는 무엇입니까?

AWS 공식업데이트됨 일 년 전