Byte-Dictionary 인코딩
Byte Dictionary 인코딩에서는 디스크에 저장되어 있는 열 값 블록마다 고유 값의 딕셔너리가 별도로 생성됩니다. Amazon Redshift 디스크 블록은 1MB를 차지합니다. 딕셔너리에는 1바이트 값이 최대 256개까지 원래 데이터 값에 대한 인덱스로 저장됩니다. 단일 블록에 저장되는 값이 256개를 넘어가면 추가 값이 압축되지 않은 원시 형태로 블록에 작성됩니다. 이 프로세스가 각 디스크 블록마다 반복됩니다.
이 인코딩은 카디널리티가 낮은 문자열 열에서 매우 효과적입니다. 그래서 열의 데이터 도메인이 256개의 고유 값보다 적을 때 가장 적합합니다.
BYTEDICT로 인코딩된 문자열 데이터 유형(CHAR 및 VARCHAR)이 있는 열의 경우 Amazon Redshift는 압축된 데이터를 대상으로 직접 작동하는 벡터화된 스캔 및 조건자 평가를 수행합니다. 이러한 스캔은 하드웨어별 단일 명령과 다중 데이터(SIMD) 명령을 사용하여 병렬 처리를 수행합니다. 이렇게 하면 문자열 열 스캔 속도가 크게 향상됩니다. Byte-Dictionary 인코딩은 CHAR/VARCHAR 열에 긴 문자열이 저장되어 있는 경우에 특히 공간 효율적입니다.
예를 들어 테이블에 CHAR(30) 데이터 형식의 COUNTRY 열이 있다고 가정하겠습니다. 데이터가 로드되면서 Amazon Redshift가 딕셔너리를 생성한 후 인덱스 값으로 COUNTRY 열을 채웁니다. 딕셔너리에 고유의 인덱스 값이 저장되고, 테이블 자체에는 해당하는 값의 1바이트 서브스크립트만 저장됩니다.
참고
고정 길이 문자 열(column)에서는 후행 공백이 저장됩니다. 따라서 CHAR(30) 열에서 Byte-Dictionary 인코딩을 사용할 때는 모든 값이 압축되어 29바이트의 스토리지를 절약합니다.
다음 표는 COUNTRY 열의 딕셔너리를 나타낸 것입니다.
고유 데이터 값 | 딕셔너리 인덱스 | 크기(고정 길이, 값 1개당 30바이트) |
---|---|---|
England | 0 | 30 |
United States of America | 1 | 30 |
Venezuela | 2 | 30 |
Sri Lanka | 3 | 30 |
Argentina | 4 | 30 |
Japan | 5 | 30 |
합계 | 180 |
다음 표는 COUNTRY 열의 값을 나타낸 것입니다.
원래 데이터 값 | 원래 크기(고정 길이, 값 1개당 30바이트) | 압축된 값(인덱스) | 새로운 크기(바이트) |
---|---|---|---|
England | 30 | 0 | 1 |
England | 30 | 0 | 1 |
United States of America | 30 | 1 | 1 |
United States of America | 30 | 1 | 1 |
Venezuela | 30 | 2 | 1 |
Sri Lanka | 30 | 3 | 1 |
Argentina | 30 | 4 | 1 |
Japan | 30 | 5 | 1 |
Sri Lanka | 30 | 3 | 1 |
Argentina | 30 | 4 | 1 |
합계 | 300 | 10 |
위 예에서 압축된 전체 크기는 다음과 같은 방법으로 계산합니다. 딕셔너리에 저장되는 입력 항목이 6개이고(6 * 30 = 180), 테이블에는 1바이트로 압축된 값 10개가 저장되어 전체 크기는 190바이트가 됩니다.