Oracle은 초대형 데이터베이스로서 금융, 우편 및 통신, 전력, 민간 항공 등 막대한 데이터 처리량과 광범위한 컴퓨터 네트워크를 갖춘 주요 조직에서 널리 사용되고 있습니다. 시스템 관리자의 경우 네트워크의 안정적인 운영을 보장하고 데이터베이스 성능을 향상하여 보다 안전하고 효율적으로 만드는 것이 특히 중요합니다. 데이터베이스 성능에 영향을 미치는 주요 요인으로 데이터베이스 조각화는 DBA의 충분한 관심을 불러일으키는 것이 DBA의 기본 유지 관리 내용입니다.
1. 프래그먼트는 왜 발생하는가?
데이터베이스가 생성되면 시스템(System) 테이블스페이스, 임시(Temporary) 테이블스페이스 등 테이블스페이스(Tablespace)라고 하는 여러 개의 논리적 세그먼트(Segment)로 나누어집니다. 테이블스페이스에는 여러 데이터 범위(Extent)와 하나 이상의 여유 범위 블록, 즉 여유 공간(Free Space)이 포함될 수 있습니다.
테이블스페이스, 세그먼트, 카테고리 및 여유 공간 간의 논리적 관계는 다음과 같습니다.
테이블스페이스에 세그먼트가 생성되면 테이블스페이스의 유효 여유 공간에서 세그먼트의 초기 범위에 대한 공간이 할당됩니다. 이러한 초기 범위가 데이터로 채워지면 세그먼트는 다른 범위 추가를 요청합니다. 이 확장 프로세스는 최대 범위 값에 도달할 때까지 계속되며 다음 범위를 위한 테이블스페이스에 여유 공간이 없을 수 있습니다. 가장 이상적인 상황은 세그먼트의 데이터가 단일 카테고리에 저장될 수 있다는 것입니다. 이러한 방식으로 모든 데이터는 세그먼트의 다른 데이터 가까이에 저장되며 데이터를 찾는 데 필요한 포인터가 더 적습니다. 그러나 세그먼트에 여러 필드가 포함되어 있는 경우가 많으며 이러한 필드가 근처에 저장되어 있음을 증명할 방법이 없습니다. 공간 요구 사항이 충족되면 데이터베이스는 더 이상 인접한 여유 범위를 닫지 않고(방법이 없는 한) 테이블 공간에서 사용할 가장 큰 여유 범위를 찾습니다. 이는 점차적으로 점점 더 분리되고 분리된 작은 여유 공간, 즉 조각을 형성하게 됩니다.
2. 조각화가 시스템에 미치는 영향
시간이 지남에 따라 데이터베이스 기반 애플리케이션 시스템의 광범위한 사용으로 인해 점점 더 많은 조각이 생성되며 이는 데이터베이스에 다음 두 가지 중요한 영향을 미칩니다.
1) 시스템 성능 저하 발생
일반적으로 공간 요구 사항이 충족되면 데이터베이스는 현재 가장 큰 여유 범위를 먼저 검색하고 "가장 큰" 여유 범위는 점차 작아지고 충분히 큰 여유 범위를 찾는 것이 점점 더 어려워집니다. 어렵기 때문에 테이블 공간의 속도 장애로 인해 데이터베이스의 공간 할당이 이상적인 상태에서 점점 더 멀어지게 됩니다.
2) 많은 양의 테이블 공간을 분산시킨다
일부 여유 영역(예: 테이블 공간의 pctincrease가 0이 아님)은 SMON(시스템 모니터링) 백그라운드 보스 프로세스에 의해 주기적으로 병합되지만 자동으로 닫힐 수 없는 일부 여유 영역은 항상 존재하므로 많은 테이블을 낭비합니다. 공간. .
3. 무료 카테고리의 단편 계산
여유 공간 조각화는 범주 수, 최대 범위 크기 등 여러 부분으로 구성되므로 FSFI-Free Space Fragmentation Index(Free Space Fragmentation Index) 값을 사용하여 다음을 직관적으로 반영할 수 있습니다.
FSFI=100*SQRT(최대(범위)/합계(범위))*1/SQRT(SQRT(수(범위)))
보시다시피 FSFI의 최대값은 100(이상적인 단일 테이블스페이스)입니다. 스코프가 증가하면 FSFI 값은 천천히 감소하고, 최대 스코프 크기가 감소하면 FSFI 값은 급격히 감소합니다.
다음 스크립트를 사용하여 FSFI 값을 계산할 수 있습니다.
rem FSFI 값 계산
렘 fsfi.sql
열 FSFI 형식 999,99
tablespace_name,sqrt(max(블록)/sum(블록))* 선택
(100/sqrt(sqrt(개수(블록)))) FSFI
dba_free_space에서
tablespace_name별로 그룹화하고 하나씩 그룹화합니다.
스풀 fsfi.rep;
/
스풀 오프;
예를 들어 특정 데이터베이스에서 fsfi.sql 스크립트를 실행하면 다음 FSFI 값이 손실됩니다.
TABLESPACE_NAME FSFI
------------------ -------
RBS 74.06
시스템 100.00
온도 22.82
도구 75.79
사용자 100.00
USER_TOOLS 100.00
YDCX_DATA 47.34
YDCX_IDX 57.19
YDJF_DATA 33.80
YDJF_IDX 75.55
---- 데이터베이스의 FSFI 값이 계산되면 비교 매개변수로 사용할 수 있습니다. 유효 여유 공간이 충분하고 FSFI 값이 30보다 큰 테이블스페이스에서는 유효 여유 공간 문제가 거의 발생하지 않습니다. 공간이 비슷한 매개변수에 가까워지면 조각 모음을 수행해야 합니다.
4. 무료 카테고리 조각 정리
테이블스페이스의 pctincrease 값이 0이 아닙니다.
테이블스페이스의 기본 저장 매개변수 pctincrease를 0이 아닌 값으로 변경할 수 있습니다. 일반적으로 다음과 같이 1로 설정합니다.
테이블스페이스 온도 변경
기본 저장공간(pctincrease 1);
이러한 방식으로 SMON은 무료 카테고리를 자동으로 그룹화합니다. 무료 카테고리를 수동으로 그룹화할 수도 있습니다.
테이블스페이스 온도 통합을 변경합니다.
5. 단락의 단편을 집어들기
우리는 세그먼트가 카테고리로 구성되어 있다는 것을 알고 있습니다. 어떤 경우에는 세그먼트 조각을 정리해야 합니다. 세그먼트 관련 정보를 보려면 데이터 딕셔너리 dba_segments를 보고, 카테고리 정보를 보려면 데이터 딕셔너리 dba_extents를 봅니다.
쿼리 데이터 세그먼트
USER_EXTENTS에서 세그먼트_이름, 테이블스페이스_이름, 바이트, 블록을 선택합니다.
디렉터리 세그먼트 쿼리
USER_EXTENTS에서 index_name, table_owner, table_name, tablespace_name을 선택합니다.
dba_segments를 통해 세그먼트 정보 보기
select tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) from
dba_segments 그룹 by 롤업(tablespace_name);
세그먼트가 과도하게 조각화된 경우 데이터를 범위로 압축하는 가장 쉬운 방법은 올바른 저장 매개변수로 세그먼트를 다시 빌드한 다음 이전 테이블의 데이터를 새 테이블에 삽입하고 동시에 이전 테이블을 삭제하는 것입니다. . 이 프로세스는 가져오기/내보내기(입력/출력) 도구를 사용하여 수행할 수 있습니다.
내보내기() 명령에는 테이블을 읽을 때 내보내기가 테이블에 할당된 물리적 공간의 양을 결정하도록 하는 (압축) 플래그가 있으며 출력 덤프 데이터에 새 초기화 저장 매개변수를 씁니다. 즉, 모두 공간을 할당합니다. 이 테이블이 닫혀 있으면 Import() 도구를 사용하여 다시 생성하세요. 이런 방식으로 해당 데이터는 새롭고 더 큰 초기 세그먼트에 배치됩니다. 예를 들어:
exp 사용자/비밀번호 파일=exp.dmp 압축=Y 부여=Y 인덱스=Y
tables=(테이블 1, 테이블 2);
출력이 원활하게 진행되면 라이브러리에서 내보낸 테이블을 삭제한 다음 출력 덤프 데이터에서 테이블을 가져옵니다.
imp 사용자/비밀번호 파일=exp.dmp 커밋=Y 버퍼=64000 전체=Y