2009-03-05 2 views
3

MySQL MyISAM 테이블을 사용할 때 ALTER TABLE 문을 사용하여 열을 추가하면 MySQL은 임시 테이블을 생성하고 원래 테이블을 덮어 쓰기 전에 모든 데이터를 새 테이블에 복사합니다.MySQL ALTER TABLE과 비교하여 스키마 변경의 Oracle 성능?

해당 테이블에 많은 양의 데이터가있는 경우이 프로세스는 매우 느려질 수 있으며 (특히 인덱스를 다시 작성하는 경우) 테이블의 복사본을 2 개 저장하기에 디스크 여유 공간이 충분해야합니다. 이것은 매우 성가신 일입니다.

열을 추가 할 때 Oracle은 어떻게 작동합니까? 대형 테이블에서 빠르지 않습니까?

저는 항상 중단 시간이 많지 않고 스키마를 변경할 수 있다는 것에 관심이 있습니다. 우리는 항상 모든 릴리스에서 스키마 변경이 필요한 새로운 기능을 소프트웨어에 추가하고 있습니다. 모든 조언을 부탁드립니다 ...

답변

6

오라클의 큰 테이블에 데이터가없는 열을 추가하는 것은 일반적으로 매우 빠릅니다. 데이터의 임시 복사본이 없으며 인덱스를 다시 작성할 필요가 없습니다. 일반적으로 느린 것은 대용량 테이블에 열을 추가하고 모든 기존 행에 대해 새 열에 데이터를 백필로 채우려는 경우 발생합니다. 이제는 많은 수의 행에 영향을주는 UPDATE 문에 대해 이야기하고 있기 때문입니다.

열을 추가하면 시간 경과에 따른 행 마이그레이션이 발생할 수 있습니다. 80 %가 4 행으로 가득 찬 블록을 보유하고 있고 시간이 지남에 따라 각 행의 크기가 30 % 증가하는 열을 추가하면 결국 Oracle에서 4 행 중 하나를 다른 행으로 이동해야하는 시점에 도달하게됩니다 블록. 이 작업은 이전 블록의 새 블록에 대한 포인터를 남겨두면 더 많은 I/O가 필요한 마이그레이션 된 행의 읽기가 발생합니다. 마이그레이션 된 행을 제거하는 것은 다소 비용이 많이들 수 있으며 일반적으로 기업용 버전을 사용한다고 가정 할 때 가동 중지 시간없이 수행 할 수는 있지만 일반적으로 가동 중지 시간이 조금이라면 더 쉽습니다. 그러나 행 이동은 일반적으로 길 아래에서 걱정할 필요가있는 사항입니다. 특정 테이블의 행 크기가 앞으로 크게 증가 할 가능성이있는 경우 테이블에 대한 더 큰 PCTFREE 설정을 지정하여 문제점을 사전에 완화 할 수 있습니다.

+0

나는 네가 "네 개의 블록으로 80 %가 넘는 블록이 있다면", 네, – Khb

+0

아주 정확합니다. 예. 감사. –

2

가동 중지 시간과 관련하여 테이블 (및 다른 DDL 작업 모음)을 변경하면 단독 잠금이 적용됩니다. 그러나 오라클은 DBMS_REDEFINITION 패키지를 사용하여 oobjects의 온라인 재정의를 수행 할 수도 있습니다.이 패키지는 실제로 가동 중지 시간에서 벗어날 수 있습니다.

+0

온라인 재정의 기능을 사용하려면 Enterprise Edition이 필요합니까? –

+0

나는 그렇게 생각하지 않는다. 나는 제품 판 비교에서 언급 된 것을 보지 못했다. http://www.oracle.com/database/product_editions.html –