예시 - Amazon Redshift

예시

다음 예에서는 Amazon Redshift CREATE TABLE 문에 있는 다양한 열 및 테이블 속성을 보여줍니다. 파라미터 정의를 비롯한 CREATE TABLE에 대한 자세한 내용은 CREATE TABLE 섹션을 참조하세요.

대부분의 예제는 TICKIT 샘플 데이터 세트의 테이블과 데이터를 사용합니다. 자세한 내용은 샘플 데이터베이스를 참조하세요.

CREATE TABLE 명령에서 데이터베이스 이름 및 스키마 이름을 테이블 이름 앞에 붙일 수 있습니다. 예를 들면 다음과 같습니다. dev_database.public.sales 데이터베이스 이름은 연결된 데이터베이스여야 합니다. 다른 데이터베이스에서 데이터베이스 객체를 만들려는 모든 시도는 실패하고 잘못된 작업 오류가 발생합니다.

배포 키, 복합 정렬 키 및 압축을 사용하여 테이블 생성

다음 예에서는 여러 열에 대해 정의된 압축을 사용하여 TICKIT 데이터베이스에서 SALES 테이블을 생성합니다. LISTID는 배포 키로 선언되고, LISTID 및 SELLERID는 다중 열 복합 정렬 키로 선언됩니다. 테이블에 대한 기본 키 및 외래 키 제약 조건 역시 정의됩니다. 제약 조건이 없는 경우 예제에서 테이블을 만들기 전에 외래 키가 참조하는 각 열에 UNIQUE 제약 조건을 추가해야 할 수 있습니다.

create table sales( salesid integer not null, listid integer not null, sellerid integer not null, buyerid integer not null, eventid integer not null encode mostly16, dateid smallint not null, qtysold smallint not null encode mostly8, pricepaid decimal(8,2) encode delta32k, commission decimal(8,2) encode delta32k, saletime timestamp, primary key(salesid), foreign key(listid) references listing(listid), foreign key(sellerid) references users(userid), foreign key(buyerid) references users(userid), foreign key(dateid) references date(dateid)) distkey(listid) compound sortkey(listid,sellerid);

결과는 다음과 같습니다.

schemaname | tablename | column | type | encoding | distkey | sortkey | notnull -----------+-----------+------------+-----------------------------+----------+---------+---------+-------- public | sales | salesid | integer | lzo | false | 0 | true public | sales | listid | integer | none | true | 1 | true public | sales | sellerid | integer | none | false | 2 | true public | sales | buyerid | integer | lzo | false | 0 | true public | sales | eventid | integer | mostly16 | false | 0 | true public | sales | dateid | smallint | lzo | false | 0 | true public | sales | qtysold | smallint | mostly8 | false | 0 | true public | sales | pricepaid | numeric(8,2) | delta32k | false | 0 | false public | sales | commission | numeric(8,2) | delta32k | false | 0 | false public | sales | saletime | timestamp without time zone | lzo | false | 0 | false

다음 예에서는 대/소문자를 구분하지 않는 col1 열이 있는 테이블 t1을 생성합니다.

create table T1 ( col1 Varchar(20) collate case_insensitive ); insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');

테이블을 쿼리합니다.

select * from T1 where col1 = 'John'; col1 ------ john JOHN (2 rows)

인터리브 정렬 키를 사용하여 테이블 생성

다음 예에서는 인터리브 정렬 키를 사용하여 CUSTOMER 테이블을 생성합니다.

create table customer_interleaved ( c_custkey integer not null, c_name varchar(25) not null, c_address varchar(25) not null, c_city varchar(10) not null, c_nation varchar(15) not null, c_region varchar(12) not null, c_phone varchar(15) not null, c_mktsegment varchar(10) not null) diststyle all interleaved sortkey (c_custkey, c_city, c_mktsegment);

IF NOT EXISTS를 사용하여 테이블 생성

다음은 CITIES 테이블을 생성하거나, 이 스키마가 이미 존재하는 경우에는 아무 것도 하지 않고 메시지를 반환하는 예입니다.

create table if not exists cities( cityid integer not null, city varchar(100) not null, state char(2) not null);

ALL 배포로 테이블 생성

다음 예에서는 ALL 배포로 VENUE 테이블을 생성합니다.

create table venue( venueid smallint not null, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer, primary key(venueid)) diststyle all;

EVEN 배포로 테이블 생성

다음 예에서는 3개의 열이 있는, MYEVENT라는 테이블을 생성합니다.

create table myevent( eventid int, eventname varchar(200), eventcity varchar(30)) diststyle even;

이 테이블은 균등하게 배포되고 정렬되지 않습니다. 테이블에 선언된 DISTKEY 또는 SORTKEY 열이 없습니다.

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'myevent'; column | type | encoding | distkey | sortkey -----------+------------------------+----------+---------+--------- eventid | integer | lzo | f | 0 eventname | character varying(200) | lzo | f | 0 eventcity | character varying(30) | lzo | f | 0 (3 rows)

다른 테이블과 같은 임시 테이블 생성

다음 예에서는 EVENT 테이블에서 열을 상속하는, TEMPEVENT라는 임시 테이블을 생성합니다.

create temp table tempevent(like event);

이 테이블은 상위 테이블의 DISTKEY 및 SORTKEY 속성도 상속합니다.

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'tempevent'; column | type | encoding | distkey | sortkey -----------+-----------------------------+----------+---------+--------- eventid | integer | none | t | 1 venueid | smallint | none | f | 0 catid | smallint | none | f | 0 dateid | smallint | none | f | 0 eventname | character varying(200) | lzo | f | 0 starttime | timestamp without time zone | bytedict | f | 0 (6 rows)

IDENTITY 열을 포함한 테이블 생성

다음 예에서는 VENUEID로 명명된 IDENTITY 열을 가진, VENUE_IDENT라는 테이블을 생성합니다. 이 열은 0으로 시작되고 각 레코드마다 1씩 증가합니다. VENUEID는 테이블의 기본 키로도 선언됩니다.

create table venue_ident(venueid bigint identity(0, 1), venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer, primary key(venueid));

기본 IDENTITY 열을 포함한 테이블 생성

다음 예제에서는 t1이라는 테이블을 생성합니다. 이 테이블에는 hist_id라는 IDENTITY 열과 base_id라는 기본 IDENTITY 열이 있습니다.

CREATE TABLE t1( hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */ base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */ business_key varchar(10) , some_field varchar(10) );

테이블에 행을 삽입하면 hist_idbase_id 값이 모두 생성됨을 알 수 있습니다.

INSERT INTO T1 (business_key, some_field) values ('A','MM');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM

두 번째 행을 삽입하면 base_id의 기본 값이 생성됨을 알 수 있습니다.

INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM 2 | 2 | B | MNOP

세 번째 행을 삽입하면 base_id의 값이 고유할 필요가 없음을 알 수 있습니다.

INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM 2 | 2 | B | MNOP 3 | 2 | B | MNNN

DEFAULT 열 값을 포함한 테이블 생성

다음 예에서는 각 열에 대한 기본값을 선언하는 CATEGORYDEF 테이블을 생성합니다.

create table categorydef( catid smallint not null default 0, catgroup varchar(10) default 'Special', catname varchar(10) default 'Other', catdesc varchar(50) default 'Special events', primary key(catid)); insert into categorydef values(default,default,default,default);
select * from categorydef; catid | catgroup | catname | catdesc -------+----------+---------+---------------- 0 | Special | Other | Special events (1 row)

DISTSTYLE, DISTKEY 및 SORTKEY 옵션

다음 예에서는 DISTKEY, SORTKEY 및 DISTSTYLE 옵션의 작동 방식을 보여줍니다. 이 예에서, COL1은 분산 키이므로 분산 스타일이 KEY로 설정되거나 설정되지 않아야 합니다. 기본적으로, 이 테이블에는 정렬 키가 없으므로 테이블이 정렬되지 않습니다.

create table t1(col1 int distkey, col2 int) diststyle key;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't1'; column | type | encoding | distkey | sortkey -------+---------+----------+---------+--------- col1 | integer | az64 | t | 0 col2 | integer | az64 | f | 0

다음 예에서는 동일한 열이 배포 키와 정렬 키로 정의되어 있습니다. 이때도 분산 스타일은 KEY로 설정되거나 설정되지 않아야 합니다.

create table t2(col1 int distkey sortkey, col2 int);
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't2'; column | type | encoding | distkey | sortkey -------+---------+----------+---------+--------- col1 | integer | none | t | 1 col2 | integer | az64 | f | 0

다음 예에서는 분산 키로 설정되는 열이 없고 COL2는 정렬 키로 설정되고 분산 스타일은 ALL로 설정됩니다.

create table t3(col1 int, col2 int sortkey) diststyle all;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't3'; Column | Type | Encoding | DistKey | SortKey -------+---------+----------+---------+-------- col1 | integer | az64 | f | 0 col2 | integer | none | f | 1

다음 예에서는 배포 키가 EVEN으로 설정되고 정렬 키는 명시적으로 정의되지 않으므로, 테이블이 균등하게 배포되지만 정렬되지 않습니다.

create table t4(col1 int, col2 int) diststyle even;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't4'; column | type |encoding | distkey | sortkey --------+---------+---------+---------+-------- col1 | integer | az64 | f | 0 col2 | integer | az64 | f | 0

ENCODE AUTO 옵션을 사용하여 테이블 생성

다음 예에서는 자동 압축 인코딩을 사용하여 테이블 t1을 생성합니다. 열에 대한 인코딩 형식을 지정하지 않으면 ENCODE AUTO가 기본값입니다.

create table t1(c0 int, c1 varchar);

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 t2를 생성합니다.

create table t2(c0 int, c1 varchar) encode auto;

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 t3를 생성합니다. 열 c0은 DELTA의 초기 인코딩 형식으로 정의됩니다. 다른 인코딩이 더 나은 쿼리 성능을 제공하는 경우 Amazon Redshift에서 인코딩을 변경할 수 있습니다.

create table t3(c0 int encode delta, c1 varchar) encode auto;

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 t4를 생성합니다. 열 c0은 초기 인코딩 DELTA로 정의되고, 열 c1은 LZO의 초기 인코딩으로 정의된다. 다른 인코딩이 더 나은 쿼리 성능을 제공하는 경우 Amazon Redshift에서 이러한 인코딩을 변경할 수 있습니다.

create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;