2011-10-31 4 views
3

기본 키를 변경하는 2 가지 방법을 보았습니다. 접근 방법 (1), (그것뿐만 아니라 해당 인덱스를 삭제) 후 즉기본 키 변경

alter table TABLE_NAME drop constraint PK_TABLE_NAME drop index; 
alter table TABLE_NAME 
add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 
    TABLESPACE "USERS" ENABLE; 
COMMIT; 
/

두 번째 방법은 indiviually 모든 단계를하고있는에있는 새 인덱스가 기본 키를 만들어 기본 키를 삭제하는 무언가이다

alter table TABLE_NAME drop constraint PK_TABLE_NAME; 
drop index PK_TABLE_NAME; 

CREATE UNIQUE INDEX PK_TABLE_NAME ON TABLE_NAME 
(COL1) 
LOGGING 
TABLESPACE USERS 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
      INITIAL   64K 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ) 
NOPARALLEL; 

alter table TABLE_NAME add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") USING INDEX PK_TABLE_NAME; 
COMMIT; 
/

그래서 지금은 내 질문

  1. 는이 두 방식은 단계가 갈라는 사실을 제외하고는 백엔드에서 다른 아무것도했다있다인가?
  2. "COL1" 또는 따옴표없이 COL1과 같이 열 이름을 언급 할 수 있습니다. 이 두 가지 접근 방식이 차이가 있습니까?
  3. TRILLION OF DATA가있는 테이블에서이 단계가 실행되고 있다고 가정 할 때, 이들 중 하나라도 다른 것에 성능 향상이 있습니까?

답변

2

정확하게 DDL을 사용하면 내가 아는 한 두 가지 사이에 차이가 없습니다. (이것은 select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual;을 비교하고, 몇 가지 간단한 성능 테스트와이 두 가지 접근법을 다룬 이전 경험을 토대로합니다.)

하지만 행이나 바이트가 수조라면 병렬 처리를 사용해야하며 확연히 다른. 첫 번째 방법은 인덱스를 병렬로 생성하는 것을 허용하지 않지만 (ORA-03001: unimplemented feature) 두 번째 방법이 있습니다. 인덱스를 평행하게하지 않으려는 경우에도 인덱스를 병렬로 만든 다음 noparallel로 변경해야합니다. 열이 모두 대문자 인 경우


는 따옴표에 관해서는, 그들은 아무런 차이도하지 않습니다. 그러나 대소 문자를 혼용하면 이름이 대소 문자를 구분한다는 것을 의미하므로 이름을 나타 내기 위해 항상 인용 부호를 사용해야합니다. 정말 짜증나. 그래서 대개 대소 문자를 구분하지 못하도록 대개 따옴표를 제거합니다.


몇 가지 다른 메모. NOLOGGING 사용을 고려할 수도 있습니다. 그리고 COMMIT;에 대한 필요성이 없기 때문에 DDL은 자동으로 커밋을 발생시킵니다.

+0

두 번째 방법으로 색인을 생성하는 동안 '병렬'을 사용하는 것이 좋았습니다. – pahariayogi