2013-07-23 4 views
4

일부 테이블의 초기 대량로드를 수행합니다 (소스 및 대상 모두 Oracle 11g). 프로세스는 다음과 같습니다. 1. 잘라 내기, 2. 색인 삭제 (PK 및 고유 색인), 대량 삽입, 4. 색인 작성 (다시 PK 및 고유 색인). (참고로 테이블이 6 열 약 22 억 레코드가)Oracle 11g 필요한 TEMP 테이블 스페이스를 계산하는 방법은 무엇입니까?

그래서 분명히
alter table TARGET_SCHEMA.MYBIGTABLE 
add constraint PK_MYBIGTABLE primary key (MYBIGTABLE_PK) 
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 

TEMP 테이블 스페이스는 PK 생성을위한 작은이다 : 지금 나는 다음과 같은 오류가 발생했습니다. 그래서 나는 이것을했다 :

explain plan for 
select line_1,line_2,line_3,line_4,line_5,line_6,count(*) as cnt 
from SOURCE_SCHEMA.MYBIGTABLE 
group by line_1,line_2,line_3,line_4,line_5,line_6; 

select * from table(dbms_xplan.display); 
/* 
----------------------------------------------------------------------------------------------- 
| Id | Operation   | Name    | Rows | Bytes |TempSpc| Cost (%CPU)| Time  | 
----------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |     | 2274M| 63G|  | 16M (2)| 00:05:06 | 
| 1 | HASH GROUP BY  |     | 2274M| 63G| 102G| 16M (2)| 00:05:06 | 
| 2 | TABLE ACCESS FULL| MYBIGTABLE  | 2274M| 63G|  | 744K (7)| 00:00:14 | 
----------------------------------------------------------------------------------------------- 
*/ 

이 방법은 얼마나 많은 TEMP 테이블 스페이스가 필자의 경우 (102GB)에 필요한지 알려주 는가? 아니면 견적을 다르게 하시겠습니까?

추가 : PK는 대상 시스템에만 존재합니다. 하지만 공정한 점이있어서 타겟 PK에 대한 귀하의 질의를 실행합니다 :

explain plan for 
select MYBIGTABLE_PK 
from TARGET_SCHEMA.MYBIGTABLE 
group by MYBIGTABLE_PK ; 

------------------------------------------------------------------------------------------- 
| Id | Operation   | Name     | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |      |  1 | 13 |  3 (34)| 00:00:01 | 
| 1 | HASH GROUP BY  |      |  1 | 13 |  3 (34)| 00:00:01 | 
| 2 | TABLE ACCESS FULL| MYBIGTABLE   |  1 | 13 |  2 (0)| 00:00:01 | 
------------------------------------------------------------------------------------------- 

그래서 지금 어떻게 읽어야합니까?

답변

1

이것은 좋은 질문입니다. 당신이 작성하는 경우

먼저 다음 기본 키 다음

alter table TARGET_SCHEMA.MYBIGTABLE 
    add constraint PK_MYBIGTABLE primary key (MYBIGTABLE_PK) 

당신은

explain plan for 
    select PK_MYBIGTABLE 
    from SOURCE_SCHEMA.MYBIGTABLE 
    group by PK_MYBIGTABLE 

이 추정 (당신이 통계 exec dbms_stats.gather_table_stats('SOURCE_SCHEMA','MYBIGTABLE')를 수집 확인을 얻으려면 쿼리합니다.

둘째, 당신은 V$TEMPSEG_USAGE을 쿼리하여 던지기 전에 얼마나 많은 임시 블록이 소비되었는지 확인하고 v$session_longops을 통해 얼마나 많은 tot 블록을 볼 수 있는지 알아볼 수 있습니다. 알 프로세스 완료.

Oracle docs은 프로세스가 다른 작업을 방해하지 않도록 전용 임시 테이블 공간을 생성 할 것을 제안합니다.

보다 정확한 해결책을 찾으면 수정 사항을 게시하십시오.