AMAZON REDSHIFT. 데이터 압축3 - 관리
AWSanalyze compression
analyze compression 명령은 기존 테이블의 최적의 압축 인코딩을 찾는데 사용한다. analyze compression 명령을 실행하면 각 열의 최적의 압축 인코딩 유형과 압축률을 표시해 준다. 하지만 copy 명령과 달리 직접 테이블에 압축 인코딩을 적용하지 않는다.
analyze compression 명령 예제
-- 테이블의 모든 열에 대해 조사 analyze compression customer -- 테이블의 일부 열에 대해 조사 analyze compression customer (c_city,c_nation,c_region) -- 테이블의 일부 열에 대해 조사 analyze compression customer comprows 100
앞에서 만든 raw 인코딩의 customer 테이블에 analyze compression 명령을 수행한 결과는 다음과 같다.
Table | Column | Encoding | Est_reduction_pct |
customer | c_custkey | delta | 75 |
customer | c_name | zstd | 97.06 |
customer | c_address | zstd | 31.82 |
customer | c_city | bytedict | 92.46 |
customer | c_nation | bytedict | 90.68 |
customer | c_region | bytedict | 90.46 |
customer | c_phone | zstd | 61.98 |
customer | c_mktsegment | bytedict | 92.31 |
Encoding 열은 압축률이 가장 좋은 최적의 압축 인코딩 유형이고, Est_reduction_pct값은 압축률을 뜻한다. 압축률이 75(%)이라면 원본의 크기가 100이라면 압축 후 25로 줄어든다는 이야기다.
analyze compression 명령의 결과대로 압축 인코딩을 적용하기 위해서는 테이블을 새로 만들어야 한다. 다음은 analyze compression 명령의 결과대로 압축 인코딩을 지정한 CREATE TABLE 문이다.
create table customer_new ( c_custkey integer not null sortkey encode raw, c_name varchar(25) not null encode zstd, c_address varchar(25) null encode zstd, c_city varchar(10) null encode bytedict, c_nation varchar(15) null encode bytedict, c_region varchar(12) null encode bytedict, c_phone varchar(15) null encode zstd, c_mktsegment varchar(10) not null encode bytedict );
Amazon Redshift Column Encoding Utility
Amazon에서 만든 유틸리티를 소개하고자 한다. Amazon Redshift Column Encoding Utility는 analyze compression 명령의 결과에서 얻은 최적의 인코딩 유형대로 새 테이블을 만들어주는 SQL 스크립트를 만들어준다. 뿐만 아니라, 기존 테이블의 sortkey, distkey, primary key, foreign key 등도 모두 동일하게 만들 수 있도록 스크립트가 만들어 진다.
파이썬으로 작성된 이 유틸리티의 기본 사용법은 다음과 같다.
python analyze-schema-compression.py --db db_name --db-user username --db-pwd password --db-host redshift_address
이렇게 실행하면 데이터베이스 안에 존재하는 모든 테이블에 대해 조사와 스크립트를 생성이 이루어진다. 다음은 앞에서 만든 customer 테이블에 대해 유틸리티를 실행한 결과이다.
> python analyze-schema-compression.py --db db_name --db-user user_name --db-pwd password --db-host host --analyze-table customer
-- [36712] [36712] Running set statement_timeout = '1200000'
-- [36712] Success.
-- [36712] [36712] Running set application_name to 'ColumnEncodingUtility-v.9.3.4'
-- [36712] Success.
-- [36712] [36712] Running set search_path to '$user', public, public;
-- [36712] Success.
-- [36712] Connected to tendw-test.c9ucj9e4yn8e.ap-northeast-2.redshift.amazonaws.com:5439:tendw as redsa
-- [36712] Analyzing Table 'customer' for Columnar Encoding Optimisations with 1 Threads...
-- [36712] Analyzing 1 table(s) which contain allocated data blocks
-- [36712] Table public.customer contains 7 unoptimised columns
-- [36712] Analyzing Table 'public.customer'
-- [36712] Column Encoding will be modified for public.customer
-- [36712] No encoding modifications run for public.customer
begin;
lock table public."customer";
create table public."customer_$mig"(
"c_custkey" integer NOT NULL encode RAW
,"c_name" varchar(25) NOT NULL encode zstd
,"c_address" varchar(25) encode zstd
,"c_city" varchar(10) encode bytedict
,"c_nation" varchar(15) encode bytedict
,"c_region" varchar(12) encode bytedict
,"c_phone" varchar(15) encode zstd
,"c_mktsegment" varchar(10) NOT NULL encode bytedict
)
SORTKEY(c_custkey)
;
alter table public."customer_$mig" owner to redsa;
insert into public."customer_$mig" select * from public."customer" order by "c_custkey";
analyze public."customer_$mig";
alter table public."customer" rename to "customer_20180802_jqZ9ADTiEZ_$old";
alter table public."customer_$mig" rename to "customer";
commit;
-- [36712] Performed modification of 1 tables
-- [36712] Processing Complete
'AWS' 카테고리의 다른 글
AMAZON REDSHIFT. COPY 명령2 - 최적화 (0) | 2018.08.17 |
---|---|
AMAZON REDSHIFT. COPY 명령1 - 기본내용 (0) | 2018.08.16 |
AMAZON REDSHIFT. 데이터 압축2 - 압축 수행 (0) | 2018.08.14 |
AMAZON REDSHIFT. 데이터 압축1 - 압축 유형 (0) | 2018.08.06 |
Power BI에서 Amazon Redshift 연결을 위한 구성 (0) | 2018.08.06 |