2010-03-25 2 views
3

인덱스 구성 테이블에 이상한 문제가 있습니다. 저는 Oracle 11g 표준을 실행하고 있습니다.인덱스 구성 테이블 생성 문제

내가 지금의 다른 테이블을 생성하고 그것은 오라클 < 2 분했다

set timing on 
SQL> create table dest_table(id number(16), hash number(20), type number(1)); 
Table created. 
Elapsed: 00:00:00.01 

SQL> insert /*+ APPEND */ into dest_table (id,hash,type) select id, hash, 1 from src_table; 
21108244 rows created. 
Elapsed: 00:00:15.25 

SQL> ALTER TABLE dest_table ADD (CONSTRAINT dest_table_pk PRIMARY KEY (HASH, id, TYPE)); 
Table altered. 
Elapsed: 00:01:17.35 

src_table

에서 2 열을 복사 할 수
SQL> desc src_table; 
Name   Null? Type 
--------------- -------- ---------------------------- 
ID  NOT NULL NUMBER(16) 
HASH  NOT NULL NUMBER(3) 
........ 

SQL> select count(*) from src_table; 
    COUNT(*) 
---------- 
    21108244 

src_table 테이블이있다.

지금 같은 운동을하지만 IOT 테이블

SQL> CREATE TABLE dest_table_iot (
     id  NUMBER(16) NOT NULL, 
     hash NUMBER(20) NOT NULL, 
     type NUMBER(1) NOT NULL, 
     CONSTRAINT dest_table_iot_PK PRIMARY KEY (HASH, id, TYPE) 
    ) ORGANIZATION INDEX; 

Table created. 
Elapsed: 00:00:00.03 

SQL> INSERT /*+ APPEND */ INTO dest_table_iot (HASH,id,TYPE) 
    SELECT HASH, id, 1 
    FROM src_table; 

IOT는 18시간 소요에 "삽입"! 필자는 win과 linux에서 실행되는 Oracle의 2 가지 다른 인스턴스에서 동일한 결과를 얻었습니다.

여기에 무슨 일이 일어나고 있습니까? 왜 그렇게 오래 걸리나요?

답변

8

APPEND 힌트는 힙 정리 테이블에만 유용합니다.

당신이 IOT에 삽입

, 나는 각 행은 인덱스의 재 균형의 많은 원인이 별도로 실제 인덱스 구조에 삽입하는 것을 생각한다.

당신은 힙 테이블에 인덱스를 작성

는 임시 세그먼트가 사용되며, 나는 이것이는 달리 일어날 재 균형 오버 헤드를 줄일 수 있습니다 같은데요.

나는 당신이 기본 키 빈, 힙 조직 테이블을 생성하고, APPEND 힌트없이 동일한 삽입을했다면, 그것은 18시간 등의 이상이 걸릴 것이라고 생각한다.

당신은 당신의 선택에 의해 주문을 넣어 시도하고는 IOT에 삽입의 성능에 미치는 영향을 볼 수 있습니다. 어떤 방법 으로든 개선 될 수는 없지만 그렇다고 할 수 있습니다.

+1

@Dave. 당신은 절대적으로 옳습니다. select 문 (IOT 테이블의 기본 키와 같은 순서)에 order by 절을 추가 한 후 IOT 테이블을 생성하는 데 2 ​​분이 걸렸습니다. 감사. – mtim