전체 복사 수행
전체 복사는 대량 삽입을 사용하여 테이블을 다시 생성하고 다시 채움으로써 테이블을 자동으로 정렬합니다. 테이블에 정렬되지 않은 큰 리전이 있는 경우, 전체 복사가 vacuum보다 훨씬 빠릅니다. 딥 카피 작업 중에는 추적할 수 있는 경우에만 동시 업데이트를 수행하는 것이 좋습니다. 프로세스가 완료되면 델타 업데이트를 새 테이블로 옮깁니다. VACUUM 작업은 동시 업데이트를 자동으로 지원합니다.
다음 방법 중 하나를 선택해 원본 테이블의 사본을 만들 수 있습니다.
-
원본 테이블 DDL을 사용합니다.
CREATE TABLE DDL을 사용할 수 있는 경우, 가장 빠르고 선호되는 방법입니다. 새 테이블을 만들면 기본 키와 외래 키를 비롯해 모든 테이블 및 열 속성을 지정할 수 있습니다. SHOW TABLE 함수를 사용하여 원본 DDL을 찾을 수 있습니다.
-
CREATE TABLE LIKE를 사용합니다.
원본 DDL을 사용할 수 없는 경우, CREATE TABLE LIKE를 사용해 원본 테이블을 다시 생성할 수 있습니다. 새 테이블은 상위 테이블의 인코딩, 배포 키, 정렬 키 및 null이 아닌 속성을 상속합니다. 새 테이블은 상위 테이블의 기본 키 및 외래 키 속성은 상속하지 않지만 ALTER TABLE을 사용해 추가할 수 있습니다.
-
임시 테이블을 생성하고 원본 테이블을 자릅니다.
상위 테이블의 기본 키와 외래 키 특성을 유지해야 하는 경우. 상위 테이블에 종속성이 있는 경우 CREATE TABLE ... AS(CTAS)를 사용하여 임시 테이블을 만들 수 있습니다. 그런 다음 원본 테이블을 자르고 임시 테이블을 이용해 원본 테이블을 채웁니다.
임시 테이블을 사용하면 영구 테이블을 사용하는 경우에 비해 성능이 대폭 향상되지만 데이터가 손실될 위험이 있습니다. 임시 테이블은 자신이 생성된 세션이 끝날 때 자동으로 삭제됩니다. TRUNCATE는 트랜잭션 블록 내에 있더라도 즉시 커밋됩니다. TRUNCATE가 성공했지만 후속 INSERT가 완료되기 전에 세션이 종료되면 데이터가 손실됩니다. 데이터 손실을 허용할 수 없다면 영구 테이블을 사용합니다.
테이블의 복사본을 생성한 후 새 테이블에 대한 액세스 권한을 부여해야 할 수 있습니다. GRANT를 사용하여 액세스 권한을 정의할 수 있습니다. 테이블의 모든 액세스 권한을 보고 부여하려면 다음 중 하나여야 합니다.
-
슈퍼 사용자
-
복사할 테이블의 소유자
-
테이블의 권한을 볼 수 있는 ACCESS SYSTEM TABLE 권한과, 모든 관련 권한을 부여할 권한이 있는 사용자
또한 딥 카피가 존재하는 스키마에 대한 사용 권한을 부여해야 할 수도 있습니다. 딥 카피의 스키마가 원본 테이블의 스키마와 다르며 public
스키마도 아닌 경우에는 사용 권한을 부여해야 합니다. 사용 권한을 보고 부여하려면 다음 중 하나여야 합니다.
-
슈퍼 사용자
-
딥 카피의 스키마에 대한 USAGE 권한을 부여할 수 있는 사용자
원본 테이블 DDL을 사용하여 전체 복사를 수행하려면
-
(선택적)
v_generate_tbl_ddl
이라는 스크립트를 실행하여 테이블 DDL을 다시 생성합니다. -
원본 CREATE TABLE DDL을 사용하여 테이블 사본을 만듭니다.
-
INSERT INTO … SELECT 문을 사용하여 원본 테이블의 데이터로 사본을 채웁니다.
-
이전 테이블에 부여된 권한을 확인합니다. 이러한 권한은 SVV_RELATION_PRIVILEGES 시스템 보기에서 확인할 수 있습니다.
-
필요한 경우 이전 테이블의 권한을 새 테이블에 부여합니다.
-
원래 테이블에 권한이 있는 모든 그룹과 사용자에게 사용 권한을 부여합니다. 딥 카피 테이블이
public
스키마에 있거나 원본 테이블과 동일한 스키마에 있는 경우에는 이 단계를 수행하지 않아도 됩니다. -
원본 테이블을 삭제합니다.
-
ALTER TABLE 문을 사용하여 사본의 이름을 원본 테이블 이름으로 변경합니다.
다음 예는 sample_copy라는 이름의 SAMPLE 복제본을 사용하여 SAMPLE 테이블에서 전체 복사를 수행합니다.
--Create a copy of the original table in the sample_namespace namespace using the original CREATE TABLE DDL. create table
sample_namespace
.sample_copy ( … ); --Populate the copy with data from the original table in the public namespace. insert into sample_namespace.sample_copy (select * frompublic
.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to groupgroup1
; grant INSERT, UPDATE on table sample_namespace.sample_copy to groupgroup2
; grant SELECT on table sample_namespace.sample_copy touser1
; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy touser2
; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
CREATE TABLE LIKE를 사용하여 전체 복사를 수행하려면
-
CREATE TABLE LIKE를 사용하여 새 테이블을 생성합니다.
-
INSERT INTO … SELECT 문을 사용하여 현재 테이블에서 새 테이블로 행을 복사합니다.
-
이전 테이블에 부여된 권한을 확인합니다. 이러한 권한은 SVV_RELATION_PRIVILEGES 시스템 보기에서 확인할 수 있습니다.
-
필요한 경우 이전 테이블의 권한을 새 테이블에 부여합니다.
-
원래 테이블에 권한이 있는 모든 그룹과 사용자에게 사용 권한을 부여합니다. 딥 카피 테이블이
public
스키마에 있거나 원본 테이블과 동일한 스키마에 있는 경우에는 이 단계를 수행하지 않아도 됩니다. -
현재 테이블을 삭제합니다.
-
ALTER TABLE 문을 사용하여 새 테이블의 이름을 원본 테이블 이름으로 변경합니다.
다음 예는 CREATE TABLE LIKE를 사용하여 SAMPLE 테이블에서 전체 복사를 수행합니다.
--Create a copy of the original table in the sample_namespace namespace using CREATE TABLE LIKE. create table
sameple_namespace
.sample_copy (likepublic
.sample); --Populate the copy with data from the original table. insert into sample_namespace.sample_copy (select * from public.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to groupgroup1
; grant INSERT, UPDATE on table sample_namespace.sample_copy to groupgroup2
; grant SELECT on table sample_namespace.sample_copy touser1
; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy touser2
; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
임시 테이블을 생성하고 원본 테이블을 잘라 전체 복사를 수행하려면
-
CREATE TABLE AS를 사용하여 원본 테이블의 행으로 임시 테이블을 생성합니다.
-
현재 테이블을 자릅니다.
-
INSERT INTO … SELECT 문을 사용하여 임시 테이블에서 원본 테이블로 행을 복사합니다.
-
임시 테이블을 삭제합니다.
다음 예는 임시 테이블을 생성하고 원본 테이블을 잘라 SALES 테이블에서 전체 복사를 수행합니다. 원본 테이블은 그대로 유지되므로 복사 테이블에 권한을 부여하지 않아도 됩니다.
--Create a temp table copy using CREATE TABLE AS. create temp table salestemp as select * from sales; --Truncate the original table. truncate sales; --Copy the rows from the temporary table to the original table. insert into sales (select * from salestemp); --Drop the temporary table. drop table salestemp;