CREATE TABLE AS
CREATE TABLE AS 명령을 사용하여 SELECT문의 결과를 기반으로 테이블 작성할 수 있습니다. 이 명령의 이름을 종종 줄여서 CTAS라고도 합니다.
- 일반 태스크
- CREATE TABLE AS 명령을 사용하여 테이블 작성하고 SELECT 명령의 데이터로 이를 채울 수 있습니다.
- 새 컬럼 이름의 명시적 목록을 제공하여 컬럼 이름을 대체하는 경우가 아니면, 테이블 컬럼은 SELECT 명령의 출력 컬럼과 연관된 이름 및 데이터 유형을 보유합니다.
- CREATE TABLE AS 명령은 테이블을 작성하고 쿼리를 한 번 평가하여 초기에 새 테이블을 채웁니다. 새 테이블은 쿼리의 소스 테이블에 대한 후속 변경사항을 추적하지 않습니다. (이와는 반대로, 뷰를 쿼리할 때마다 이는 기본 SELECT 명령을 재평가합니다.)
- 소형 CTAS에서 자동 통계 제외
- CTAS 작업 중에 Netezza Performance Server 일반적으로 CTAS 작업 후 생성된 테이블에 대한 통계를 수집하기 위해 GENERATE STATISTICS를 실행합니다. 그러나 보다 짧은 테이블 쿼리의 경우, GENERATE STATISTICS 프로세스는 종종
CTAS 조작 자체보다 실행에 더 많은 시간이 걸릴 수 있습니다.
CTAS 조작이 제출되면 테이블 작성 및 삽입 조작이 실행됩니다. 삽입 작업 중에 Netezza Performance Server 모든 열에 대한 최소값, 최대값 및 영역 맵을 계산합니다. 삽입 작업으로 인해 구성된 임계값(ctas_auto_stats_min_rows)보다 적은 수의 행이 생성되는 경우 Netezza Performance Server 통계 생성 작업을 건너뜁니다.
이 기능을 제어하는 두 개의 postgresql.conf 파일 설정이 있습니다.- enable_small_ctas_autostats는 소형 테이블에서 자동 통계를 제외하는 기능을 사용하거나 사용 안합니다. 이 설정은 기본적으로 사용으로 설정됩니다.
- ctas_autostats_min_rows는 소형 테이블에 대한 임계값 숫자를 지정합니다. Netezza Performance Server 이 임계값 미만인 테이블에 대해서는 통계를 계산하지 않습니다. 기본값은 10000입니다.
- 분배 키 처리
- 명시적 분배 키를 정의하지 않은 경우, CTAS 테이블은 상위 테이블에서 해당 분배를 상속합니다. 일반적으로, 대상 테이블의 분배는 플랜의 최종 노드에 의해 정의됩니다. 최종 노드에 유효한 분배가 있으면 시스템은 해당 분배를 CTAS 대상에 지정합니다. 최종 플랜 노드에 분배가 없는 경우(호스트의 노드처럼)에만 시스템 기본값이 테이블의 첫 번째 컬럼입니다.
기본 분배 키는 첫 번째 컬럼(해시 분배)입니다. 여기에는 분별되는 분배 키가 없거나 CTAS 테이블로의 소스 스트림에 라운드 로빈 분배가 있습니다.
t_one 테이블은 f_one에서 분배 키를 상속합니다. (이의 기본값은 첫 번째 컬럼이 아닙니다.)CREATE TABLE t_one AS SELECT … FROM tbl …;t_two 테이블은 (tbl_one+tbl_two)의 조인 테이블에서 분배 키를 상속하며, 이는 해당 조인 키입니다.CREATE TABLE t_two AS SELECT … FROM tbl_one,tbl_two … WHERE tbl_one.b1 = tbl_two.b2 …t_three 테이블은 그룹화 노드에서 분배 키를 상속하며, 이는 (b1,b2,b3)입니다.CREATE TABLE t_three AS SELECT … FROM tbl_one, tbl_two, tbl_three… WHERE … GROUP BY b1,b2,b3; - 테이블 분배의 시스템 기본값
- postgresql.conf 설정 enable_random_table_distribute는 테이블이 작성될 때 기본 분배 동작을 제어합니다. 기본값 0(사용 안함)은 다음 동작을 지정하며, 이는 이전 릴리스에서 작성된 테이블에 대한 기본 동작입니다.
- CREATE TABLE 연산의 경우:
- DISTRIBUTE ON이 지정된 경우에는 지정된 분배 메커니즘을 사용하십시오.
- DISTRIBUTE ON이 지정되지 않은 경우에는 첫 번째 컬럼을 기본 분배 키로 사용하십시오.
- CREATE TABLE AS(CTAS) 연산의 경우:
- DISTRIBUTE ON이 지정된 경우에는 지정된 분배 메커니즘을 사용하십시오.
- DISTRIBUTE ON이 지정되지 않은 경우에는 플랜에서 분배 키를 상속하십시오. 플래너가 플랜에서 분배를 판별할 수 없는 경우에는 첫 번째 컬럼을 기본 키로 사용하십시오.
enable_random_table_distribute=1(사용함)을 지정하는 경우, 시스템 동작은 다음으로 변경됩니다.- CREATE TABLE 연산의 경우:
- DISTRIBUTE ON이 지정된 경우에는 지정된 분배 메커니즘을 사용하십시오.
- DISTRIBUTE ON이 지정되지 않은 경우에는 무작위를 분배 방법으로 사용하십시오.
- CREATE TABLE AS(CTAS) 연산의 경우:
- DISTRIBUTE ON이 지정된 경우에는 지정된 분배 메커니즘을 사용하십시오.
- DISTRIBUTE ON이 지정되지 않은 경우에는 플랜에서 분배 키를 상속하십시오. 플래너가 플랜에서 분배를 판별할 수 없는 경우에는 무작위를 분배 방법으로 사용하십시오.
일부 경우, 플래너가 플랜에서 분배를 판별하지 못할 수 있습니다. 예를 들어,- 최종 조인이 호스트에서 발생하는 경우, 해당 조인의 결과의 분배는 비결정적입니다.
- <선택 목록>에서 분포 열이 누락된 경우 분포는 비결정적입니다.
- 최종 결과 노드의 분배가 무작위인 경우, 분배는 비결정적이라고 간주됩니다.
- 최종 조인이 완전 외부 조인인 경우, 역시 분배가 비결정적입니다.
이 변경사항 때문에 이전 릴리스에서 이 동작을 제어하던 NZ_DISABLE_SKEW_DEFENSE 환경 변수는 더 이상 필요하지 않습니다. 릴리스 4.6으로 업그레이드하는 경우에는 변수의 존재를 확인하며, 설정된 경우 해당 값을 사용하여 enable_random_table_distribute를 대응되는 값으로 설정합니다.
postgresql.conf 변수를 변경하려면 다음을 수행하십시오.- 표준 편집기를 사용하여 구성 파일 nz/data/postgresql.conf를 여십시오.
- '
the enable_random_table_distribute = 0'이 포함된 줄을 찾습니다. - 변수를 0에서 1로 변경하고 변경사항을 저장하십시오.
- 변경 사항을 적용하려면 Netezza Performance Server 시스템을 다시 시작하세요.
- CREATE TABLE 연산의 경우:
구문
CREATE [ TEMPORARY | TEMP ] TABLE <table> [ (<col>[,<col>…] ) ]
AS <select_clause> [ DISTRIBUTE ON ( <dist_col>[,<dist_col>…] ) ]입력
| 입력 | 설명 |
|---|---|
| TEMPORARY 또는 TEMP | 임시 테이블을 작성합니다. |
| <table> | 작성되는 테이블의 이름입니다. 임시 테이블은 이미 존재하는 영구 테이블과 동일한 이름을 보유할 수 있습니다. 그러나 기타 테이블 이름은 데이터베이스 범위 내에서 고유해야 합니다. |
| <col> | 새 테이블에서 컬럼의 이름입니다. 컬럼 이름을 제공하지 않으면 SELECT절의 출력 컬럼 이름에서 이름을 가져옵니다. |
| <선택절> | SELECT (행을 검색하는 경우)에 설명된 대로 SELECT 명령입니다. |
| <dist_col> | 분배 컬럼의 이름입니다. 배포 열에 대한 자세한 내용은 권한의"배포 키 처리"를 참조하세요. |
출력
가능한 출력 메시지의 목록은 CREATE TABLE 및 SELECT 명령을 참조하십시오.
특권
관리 사용자, 데이터베이스 또는 스키마의 소유자이거나, 테이블 작성 특권이 있어야 합니다. SELECT문에서 사용 중인 테이블에 대한 선택 특권도 있어야 합니다.
사용량
샘플 사용법은 다음과 같습니다.
- 이름이
cows인 다음 테이블을 고려하십시오.cnumber | cname | cbreed | ckind ---------+--------+-------------+------- 3 | Cindy | Ayrshire | milk 8 | Muffin | Guernsey | milk 2 | Martha | Brown Swiss | milk 7 | Joe | Angus | beef 5 | Gretel | Highland | beef 1 | Betsy | Holstein | milk 6 | Bob | Angus | beef 4 | Mindy | Hereford | beef 9 | Milda | Jersey | milkcows테이블의 두 컬럼에서 테이블을 작성합니다.MYDB.SCH1(USER)=> CREATE TABLE cows2 AS SELECT cname, cbreed FROM cows;결과적으로 이름이cows2인 새 테이블이 작성됩니다.MYDB.SCH1(USER)=> SELECT * FROM cows2; cname | cbreed --------+------------- Cindy | Ayrshire Muffin | Guernsey Mindy | Hereford Milda | Jersey Betsy | Holstein Gretel | Highland Martha | Brown Swiss Joe | Angus Bob | Angus