인덱스 리빌드 추가 답변 0 4 6,582

by TeLl2 [2009.10.22 16:06:15]


위의 질문 중

3번의 인덱스를 리빌드 하는데 인덱스 테이블 스페이스 부족하다고
ORA-1652: unable to extend temp segment by ... in tablespace                 IDX
위의 에러 발생이 왜 나는 지에 대한 문의가 있어 답변드리면

앞서 얘기한 것과 같이 인덱스 리빌드시 TEMP TABLESPACE를 이용하여 
임시 인덱스 세그먼트를 만들고 이 인덱스 세그먼트를 기존 인덱스로 체인지 하기 위해
기존 인덱스를 드랍하고 임시 인덱스를 기존 인덱스로 바꾸게 됩니다.
이러기 위해서는 잠시동안이라도 두개의 인덱스가 인덱스 테이블 스페이스에 공존하게 됩니다. 두개의 인덱스를 가지고 있을 공간이 없을 경우 위의 에러가 발생합니다.

그럼 왜 위의 2개의 인덱스가 필요한가인데요..
우선은 인덱스 리빌드 세션이 에러 및 기타 장에로 작업이 완료 되지 않았을 경우 기존꺼를 사용할 수 있어야 하며,
'ALTER INDEX XXX REBUILD;' 만을 사용했을 경우 
다른 세션에서는 위의 인덱스를 사용할 수 있어야 합니다. 단 위의 경우는  SELECT 만이 가능합니다.
ONLINE 옵션을 주었을 경우에만 모든 DML이 가능합니다.

또한 ONLINE 옵션을 주어지지 않으면 기존인덱스를 이용하여 인덱스를 새로 생성하지만,
ONLINE 옵션 시에는 기존인덱스를 사용하지 않는대신 테이블을 읽어서 처리 하게 됩니다.

by 김정식 [2009.10.22 19:20:47]
테리2형.. 바쁠텐데..
답변 다 달아주다니 정말 대단하네요..

by 현 [2009.10.22 20:38:27]
2개의 인덱스가 있어야 하는건 아는데,
그게 왜 temp 에러로 나올까?

by TeLl2 [2009.10.23 09:41:45]
인덱스를 생성시 혹은 리빌드시 정렬이 필요하기 때문에
정의된 컬럼에 맞게 temp tablespace에서 정렬을 수행하며
정렬이 모드 끝난 하나의 집합이 인덱스가 됩니다.
이것을 생성시 정의 한 테이블 스페이스로 이관 작업을 하게 됩니다.
이때 이관되는 세그먼트는 임시 세그 먼트가 됩니다.
인덱스 생성을 위하여 익스텐트를 할당받고
이관작업(생성 작업)시에도 익스텐트를 할당 받는 방식은
다른 세그먼트의 익스텐트 할당 방식과 같이 tablespace에
system이든 uniform이든 정의에 따라 할당 받게 됩니다.
해당 테이블 스페이스에서 익스텐트를 할당 받지 못하면
위와 같은 에러가 발생하는 것이구요.
생성하려고 하는 segment가 temp segment이므로
temp segment로 에러가 나타나게 됩니다.

by TeLl2 [2009.10.23 09:42:54]
그리고 정식아..
난 한가해..
난 항상 프리하니깐...ㅋㅋ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입