
Oracle 10g의 테이블스페이스는 거의 100% 사용됩니다.
크기(MB) = 571,768.0 사용됨(MB) = 571,534.0
방금 해당 테이블스페이스와 연결된 스키마에 속하는 테이블에서 수천 개의 레코드를 삭제(및 커밋)했습니다. 놀랍게도 Enterprise Manager의 테이블스페이스 페이지에 따르면 확보된 공간이 없습니다.
질문: Oracle이 삭제된 레코드에 해당하는 공간을 해제하도록 강제로 수행해야 할 작업이 있습니까?
답변1
테이블 {table_name}을 변경하여 행 이동을 활성화합니다.
테이블 {table_name} 축소 공간 변경;
답변2
Enterprise Manager에서 보고 있는 페이지는 DBA_DATA_FILES
(테이블스페이스에 할당된 다양한 파일의 총 크기를 알려주는)과 DBA_SEGMENTS
(테이블스페이스에 할당된 모든 세그먼트의 총 크기를 알려주는 ) 비교를 통해 사용 가능한 공간을 거의 확실히 보고하고 있습니다. 테이블스페이스). 단순히 일부 데이터를 삭제했다고 해서 변경되는 것은 아닙니다.
데이터를 삭제하면 특정 개체에 할당된 블록 및 범위 내의 공간이 확보됩니다. 따라서 FOO 테이블(및 관련 FOO 인덱스)에서 100MB 상당의 데이터를 삭제해도 FOO 세그먼트의 크기는 줄어들지 않습니다. 그러나 이제 해당 세그먼트에는 FOO에 추가로 100MB 상당의 삽입을 수용할 수 있는 공간이 있게 됩니다. 테이블스페이스의 다른 세그먼트를 위한 공간을 확보하기 위해 FOO에서 공간을 삭제하는 경우 데이터를 삭제한 후 FOO를 재구성해야 합니다. 이는 가동 중지 시간과 상당한 테스트가 필요할 수 있는 다소 복잡한 프로세스입니다. . 객체의 크기를 영구적으로 줄이는 것이 아니라면 일반적으로 권장되지 않습니다. FOO가 결국 100MB의 추가 삽입을 보게 될 경우 FOO 세그먼트를 축소하여 다시 늘리는 것은 유익하지 않습니다.
DBMS_SPACE 패키지를 사용하여 다양한 세그먼트에서 사용 가능한 공간의 양을 확인할 수 있습니다. 이는 빈 블록뿐만 아니라 다양한 채워짐 상태(0-25% 가득 참, 25-50% 가득 참, 50-75% 가득 참, 75-100% 가득 참)에 있는 블록에 대해 알려줍니다. 데이터를 삭제하면 일반적으로 테이블에 할당된 비어 있는 블록 및 부분적으로 비어 있는 블록 수가 증가합니다.
답변3
허용된 답변에 대한 후속 조치와 마찬가지로 Segment Advisor(dbms_advisor 호출을 통해)를 사용하여 공간 축소 작업 실행으로 인한 공간 절약을 추정할 수 있습니다. [세그먼트 어드바이저를 실행하기 위해 라이선스 팩이 필요하지 않습니다.]
그러면 시간을 절약하고 가장 많은 이점을 얻을 수 있는 세그먼트를 타겟팅할 수 있습니다.
답변4
일반적으로 임시 테이블을 생성하여 테이블 temp_table 이름을 선택하고 * from table_you_deleted_from;을 선택하는 것이 좋습니다. 그런 다음 해당 테이블을 가리키는 원래 테이블의 인덱스를 비활성화하고 이 테이블을 삭제하고 다시 생성하여 table_you_deleted_from 이름을 선택하여 temp_table에서 *를 선택하세요. 인덱스를 다시 생성하고 제약 조건을 활성화하십시오.
여기서는 기본적으로 테이블 크기와 인덱스 트리 길이를 줄였습니다. 즉, 앞으로 검색 속도가 빨라졌습니다.