오라클 테이블 테이터 복사 관련 질문 입니다. 1 9 1,411

by it매니아 [SQL Query] [2022.07.27 09:58:29]


신규 테이블인 a_old는 a테이블 구조 그대로 가져오고 데이터도 그대로 복사하면 되는거라서 일단 카운트로 테이블 데이터 확인하고

SELECT count(*) FROM a;
--19,960,556

거의 2천만 데이터 확인이 된다음

CREATE TABLE a_old AS SELECT * FROM a;

테이블 만들면서 데이터도 가져올려고 했는데 거의 6분 이상 넘어가면서 쿼리를 취소 했습니다. 이걸 테이블 먼저 만들고 데이터를 넣는게 더 빠를까요?

a_old 테이블 생성 및 데이터 가져오는게 너무 오래 걸려서 질문 드립니다.

 

 

 

by 우리집아찌 [2022.07.27 10:24:47]

테이블 먼저 만들고 넣으신다면 데이터를 나눠서 해야합니다.

하지만 CTAS로 이행하는게 빠르긴합니다.


by 우리집아찌 [2022.07.27 10:35:22]
-- 조금이래도 성능을 위해서라면.. 
-- 이행후 LOGGING 처리 해주세요

CREATE TABLE a_old NOLOGGING AS SELECT * FROM a;

 

 


by it매니아 [2022.07.27 10:59:41]

데이터를 나눠서 넣는 방법은 어떻게 해야 될까요?


by 우리집아찌 [2022.07.27 12:46:07]

A 테이블에 PK 가 있으면 그걸 기준으로 100만건 정도 INSERT 해보시는건 어떻까요?

근데 저라면 2000만건 그냥 CTAS로 날리겠습니다.


by 우리집아찌 [2022.07.27 12:49:17]

뭐 팁이라긴 뭐한데

CREATE TABLE a_old NOLOGGING AS SELECT * FROM a WHERE 1 != 1 ;

이렇게 하면 테이블은 간단히 만들어 집니다.

 


by 포동푸우 [2022.07.27 13:23:01]
-- 대략 아래와 같습니다. 
create table a_new nologging as select * from a where 1=2 ;
insert /*+ PARALLEL(a_new,4) */ into a_new select /*+ PARALLEL(a,4) */ * from a ; 
create unique index a_new_ux01 on owner.a_new ~~~~~~ nologging parallel 4 ; 
exec dbms_stats.gather_table_stats(ownname => ’OWNER’, tabname => ’a_new’, estimate_percent=> 10, cascade => TRUE, degree=> 4) ;
alter table a_new logging ; 
alter table a_new noparallel ; 
alter index a_new_ux01 logging ; 
alter index a_new_ux01 parallel 1 ; 

 


by 우리집아찌 [2022.07.27 13:26:38]

INSERT 시 APPEND 힌트 빠졌어요.. ㅎㅎ


by 포동푸우 [2022.07.27 13:32:10]
-- insert 수행 전  
alter session enable parallel dml ; 

-- parallel 은 append 와 병행 
/*+ append parallel(a_new,4) */  
/*+ append parallel(a,4) */  

앗~ 꼼꼼하세요 ㅎㅎ 

 


by 신이만든지기 [2022.07.28 13:32:49]

라이선스에 따라 parallel 힌트를 사용할 수 없는 경우가 있다고 하더라구요.

이것도 알아보시고 사용하세요. 오라클 라이선스가 원체 비싸서리..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입