Amazon Redshift에서 VACUUM 성능 문제를 해결하려면 어떻게 해야 하나요?

5분 분량
0

VACUUM의 성능이 Amazon Redshift 클러스터에 미치는 영향이 걱정스럽습니다. VACUUM을 실행하는 데 시간이 오래 걸리는 이유와, Amazon Redshift 클러스터에서 VACUUM 작업을 실행할 때 고려해야 할 모범 사례는 무엇입니까?

간략한 설명

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

  • 정렬되지 않은 데이터의 비율이 높은 경우
  • 열이 지나치게 많은 큰 테이블
  • 인터리브 정렬 키 사용
  • VACUUM을 불규칙적으로 사용하거나 낮은 빈도로 사용하는 경우
  • 동시 테이블, 클러스터 쿼리, DDL 문 또는 ETL 작업

svv_vacuum_progress 쿼리를 사용하여 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이 실행되는 테이블 이름, vacuum 상태, 완료까지 남은 시간도 확인합니다. vacuum이 실행되고 있지 않으면 마지막으로 실행된 vacuum 상태가 svv_vacuum_progress 쿼리에 나타납니다.

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

vacuum이 실행되는 테이블의 세부 정보를 확인합니다. 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는 삭제된 행을 제외하는 행 개수입니다.
  • vacuum(삭제 및 정렬)을 완료한 후 tbl_rows와 estimated_visible_rows의 값이 서로 비슷해야 하고 unsorted는 0에 도달해야 합니다. 참고: 테이블의 데이터는 실시간으로 업데이트됩니다. VACUUM의 진행 상황을 확인하려면 쿼리를 계속 실행합니다. VACUUM이 진행되면서 unsorted 행이 점차 감소합니다. 정렬되지 않은 데이터 비율이 높은지 확인하려면 특정 테이블의 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은 자동 VACUUM DELETE이며, 2020-05-27 06:55:18.906008 UTC에 시작해서 몇 초 후에 완료되었습니다.
  • 이 vacuum을 실행한 후 삭제된 행에서 차지하던 공간이 해제되었고, 이는 vacuum을 시작하고 완료될 때 표시된 행과 블록 개수로 확인할 수 있습니다.

VACUUM을 시작하고 종료할 때 테이블이 사용하던 블록 개수에 대한 변경 사항에 유의하세요.

참고: Amazon Redshift는 백그라운드 테이블에서 vacuum 정렬과 vacuum 삭제 작업을 자동으로 수행합니다. 이러한 백그라운드 vacuum은 부하가 적을 때 실행되고, 부하가 높을 때 일시 중지됩니다. 이 자동 vacuum은 vacuum 명령을 실행할 필요를 줄여줍니다.

sortedrows 열은 테이블의 정렬된 행 개수를 표시합니다. 마지막 vacuum은 자동 VACUUM DELETE 작업이므로 정렬이 실행되지 않았습니다. 삭제 표시된 행은 VACUUM을 시작했을 때와 정렬된 행 개수가 동일한데, 그 이유는 활성화된 행이 정렬되지 않았기 때문입니다. VACUUM DELETE를 완료한 후 정렬된 행은 0으로 표시됩니다.

2020-05-27 06:28:17.128345 UTC에 시작된 첫 vacuum은 전체 vacuum으로 표시됩니다. 약 18분 후에 삭제된 행과 정렬된 행이 차지하던 공간이 해제되었습니다. vacuum 작업이 완료되면 행이 성공적으로 정렬되었기 때문에 출력에 rows와 sortedrows의 값이 동일하게 나타납니다.

이미 진행 중인 vacuum의 경우, 성능을 지속적으로 모니터링하고 VACUUM 모범 사례를 적용합니다.

VACUUM 모범 사례

다음의 모범 사례로 VACUUM 성능을 개선할 수 있습니다.

  • VACUUM은 리소스를 많이 사용하는 작업이므로 사용량이 적은 시간에 실행하세요.
  • 사용량이 적은 시간에 VACUUM 작업을 실행할 때는 wlm_query_slot_count를 사용하여 대기열의 동시성 수준을 재정의합니다.
  • 큰 테이블의 경우 임계값 파라미터를 최대 99%로 설정하고 VACUUM 작업을 실행하세요.
  • VACUUM을 실행하는 데 적절한 임계값과 빈도를 결정합니다. 예를 들어 임계값을 100%로 설정하고 VACUUM을 실행하거나 데이터가 항상 정렬되도록 할 수 있습니다. Amazon Redshift 클러스터의 쿼리 성능을 최적화하는 방식을 사용하세요.
  • 정렬되지 않은 데이터가 많은 영역이 큰 테이블에 않도록 VACUUM FULL 또는 VACUUM SORT ONLY를 수시로 실행하세요.
  • 정렬되지 않은 데이터가 큰 테이블에 대량으로 누적된다면 전체 복사를 수행하세요. 전체 복사본이 있으면 기존 테이블에 VACUUM SORT를 실행하는 대신 새 테이블에 데이터를 로드할 수 있습니다.
  • BOOST 옵션을 설정하고 VACUUM 명령을 실행하세요. BOOST 옵션은 VACUUM에 추가 리소스(예: 가용 메모리, 디스크 공간)를 할당합니다. BOOST 옵션을 사용하면 VACUUM이 하나의 창에서 작동하여 VACUUM 작업이 실행되는 동안에는 동시 삭제 및 업데이트가 차단됩니다.
    참고: BOOST 옵션을 사용하여 VACUUM을 실행하면 쿼리 성능에 영향이 발생할 수 있습니다. VACUUM BOOST 작업은 유지 관리 작업 중에나 사용량이 적은 시간에만 실행하는 것이 좋습니다.
  • 큰 테이블은 시계열 테이블로 나누어 VACUUM 성능을 개선합니다. 경우에 따라 시계열 테이블을 사용하는 것으로 VACUUM 작업을 대체할 수 있습니다.
  • 큰 테이블은 열 압축 유형을 선택합니다. 압축된 행은 데이터를 정렬할 때 디스크 공간을 적게 사용합니다.
  • VACUUM 작업 후 ANALYZE 명령을 사용하여 통계를 업데이트하세요. 쿼리 플래너가 최적의 계획을 선택하는 데 사용됩니다.

AWS 공식
AWS 공식업데이트됨 2년 전