Oracle 고수 위 선 원리 분석

원본 링크:http://www.55linux.com/oracle/performance/607.html
 
1. 수선 (High Water Mark) 은 무엇 입 니까?
모든 Oacle 세그먼트 (segments) 는 한 세그먼트 에 데이터 상한 선 을 수용 하고 있 습 니 다. 우 리 는 이 상한 선 을 'high water mark' 또는 HWM 이 라 고 부 릅 니 다.이 HWM 은 사용 하지 않 은 데이터 블록 이 이 segment 에 얼마나 분배 되 었 는 지 설명 하 는 표지 입 니 다.HWM 의 통상 적 인 성장 폭 은 한 번 에 5 개의 데이터 블록 으로 원칙적으로 HWM 은 커 질 뿐 축소 되 지 않 는 다. 표 에 있 는 데 이 터 를 모두 삭제 하 더 라 도 HWM 은 원래 의 값 이다. 이런 특징 으로 인해 HWM 은 하나의 댐 의 역사적 인 최고 수위 와 비슷 하 다. 이것 이 바로 HWM 의 원시 적 인 의미 이다. 물론 하나의 댐 에 물이 없다 고 해서 이 댐 의 역사적 인 최고 수위 가 0 이 라 고 말 할 수 없다.그러나 우리 가 표 에 truncate 명령 을 사용 하면 이 표 의 HWM 은 0 으로 다시 설 치 됩 니 다.
 
2. HWM 데이터베이스 의 조작 은 다음 과 같은 영향 을 미친다.
a) 전체 표 스 캔 은 HWM 에 표 시 된 모든 것 이 이 표 데이터베이스 블록 에 속 할 때 까지 읽 어야 합 니 다. 이 표 에 데이터 가 없 더 라 도.
b) HWM 이하 에 남 은 데이터베이스 블록 이 있 더 라 도 데 이 터 를 삽입 할 때 append 키 워드 를 사용 한 것 을 입력 하면 삽입 할 때 HWM 이상 의 데이터 블록 을 사용 하 는데 이때 HWM 은 자동 으로 커진다.
 
3. 한 시계의 HWM 을 어떻게 압 니까?
a) 먼저 시 계 를 분석한다.
ANALYZE TABLE  ESTIMATE/COMPUTE STATISTICS;

b)SELECT blocks, empty_blocks, num_rows

FROM user_tables

WHERE table_name = ;

설명:
BLOCKS 열 은 이 표 에서 사 용 했 던 데이터베이스 블록의 수, 즉 수선 을 나타 낸다.
EMPTY_BLOCKS 대 표 는 이 표 에 할당 되 지만, 수선 이상 의 데이터베이스 블록, 즉 지금까지 사용 하지 않 은 데이터 블록 이다.
 
28672 줄 의 55LINUX 표를 예 로 들 어 설명 합 시다.
1) SQL>SELECT segment_name, segment_type, blocks

FROM dba_segments

WHERE segment_name='55LINUX';

SEGMENT_NAME SEGMENT_TYPE BLOCKS 

----------------- -------------- --------- 

55LINUX TABLE 1024 

1 row selected.

 
2)SQL> ANALYZE TABLE 55LINUX ESTIMATE STATISTICS;

Statement processed.

 
3)SQL> SELECT table_name,num_rows,blocks,empty_blocks

FROM user_tables

WHERE table_name='55LINUX';

TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS

---------- -------- ------- -------------

55LINUX 28672 700 323

1 row selected.

주의:
BLOCKS + EMPTY_BLOCKS (700 + 323 = 1023) 비 DBASEGMENTS. BLOCKS 는 데이터베이스 블록 이 1 개 적 습 니 다. 이것 은 하나의 데이터베이스 블록 이 segment header 로 보존 되 어 있 기 때 문 입 니 다.DBA_SEGMENTS. BLOCKS 는 이 표 에 분 배 된 모든 데이터베이스 블록 의 수 를 표시 합 니 다.USER_TABLES. BLOCks 는 이미 사용 한 데이터베이스 블록의 수 를 표시 합 니 다.
 
4)SQL> SELECT COUNT (DISTINCT

DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||

DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"

FROM 55LINUX;

Used

----------

700

1 row selected.

 
5) SQL> delete from 55LINUX;

28672 rows processed.

 
6)SQL> commit;

Statement processed.

 
7) SQL> ANALYZE TABLE 55LINUX ESTIMATE STATISTICS;

Statement processed.

8)SQL> SELECT table_name,num_rows,blocks,empty_blocks

FROM user_tables

WHERE table_name='55LINUX';

TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS

--------- -------- ------- ----------

55LINUX 0 700 323

1 row selected.

9) SQL>SELECT COUNT (DISTINCT

DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||

DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"

FROM 55LINUX;

Used

----------

0 ----               ,      

1 row selected.

 
10)SQL> TRUNCATE TABLE 55LINUX;

Statement processed.

 
11)SQL> ANALYZE TABLE 55LINUX ESTIMATE STATISTICS;

Statement processed.

 
12)SQL> SELECT table_name,num_rows,blocks,empty_blocks

2> FROM user_tables

3> WHERE table_name='55LINUX';

TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS

---------- -------- -------- ------------

55LINUX 0 0 511

1 row selected.

 
13)SQL> SELECT segment_name,segment_type,blocks

FROM dba_segments

WHERE segment_name='55LINUX';

SEGMENT_NAME SEGMENT_TYPE BLOCKS 

------------ ------------- ------

55LINUX TABLE 512 

1 row selected.

주의:
TRUNCATE 명령 은 delete 명령 으로 생 성 된 빈 공간 을 회수 하 였 으 며, 이 표 에서 분 배 된 공간 이 원래 1024 개 에서 512 개 로 떨 어 지 는 것 을 주의 하 였 습 니 다.
delete 명령 으로 생 성 된 빈 공간 을 유지 하기 위해 서 는 TRUNCATE TABLE 55LINUX REUSE STORAGE 를 사용 할 수 있 습 니 다.
이 명령 을 사용 하면 이 시 계 는 원래 의 1024 원 이 될 것 이다.
 
4. Oracle 표 구간 의 높 은 수위 라인 HWM
Oracle 데이터 의 저장 에서 저장 공간 을 하나의 저수지 로 상상 할 수 있 고 데 이 터 는 저수지 의 물 로 상상 할 수 있다.저수지 에 있 는 물의 위 치 는 수위 선 이 라 고 하 는데 Oracle 에 서 는 이 선 을 고수 위 선 (High - warter mark, HWM) 이 라 고 부른다.데이터베이스 시트 가 처음 만 들 어 졌 을 때 아무런 데이터 가 없 었 기 때문에 이때 수위 선 은 비어 있 었 다. 즉, HWM 이 최저 치 였 다 는 것 이다.데 이 터 를 삽입 하면 높 은 수위 선 이 올 라 갑 니 다. 그러나 여기 도 하나의 특성 이 있 습 니 다. delete 문 구 를 사용 하여 데 이 터 를 삭제 하면 데 이 터 는 삭제 되 었 지만 높 은 수위 선 은 낮 아 지지 않 았 습 니 다. 아니면 방금 데 이 터 를 삭제 하기 전에 그렇게 높 은 수 위 를 가 진 것 입 니까?이 고수 위 선 은 일상적인 첨삭 작업 에서 오 를 뿐 떨 어 지지 않 는 다 는 것 이다.
 
다음은 Oracle 에서 Select 문장의 특성 을 살 펴 보 겠 습 니 다.Select 문 구 는 표 의 데 이 터 를 한 번 스 캔 합 니 다. 그러나 도대체 얼마나 많은 데이터 저장 블록 을 스 캔 합 니까? 이것 은 데이터 베이스 에 얼마나 많은 데이터 가 있 는 지 말 하 는 것 이 아 닙 니 다. Oracle 은 이렇게 큰 데이터 블록 을 스 캔 하 는 것 이 아니 라 Oracle 은 높 은 수위 선 이하 의 데이터 블록 을 스 캔 합 니 다.지금 상상 해 보 세 요. 만약 에 방금 만 든 빈 표 라면 Select 작업 을 한 번 했 습 니 다. 그러면 높 은 수위 선 HWM 이 가장 낮은 0 위치 에 있 기 때문에 데이터 블록 이 스 캔 되 어야 하지 않 고 스 캔 시간 이 매우 짧 을 것 입 니 다.만약 이때 당신 이 먼저 천만 개의 데 이 터 를 삽입 한 다음 에 delete 문장 으로 천만 개의 데 이 터 를 삭제 합 니 다.천만 개의 데 이 터 를 삽 입 했 기 때문에 이때 의 고수 위 선 은 천만 개의 데이터 에 있다.나중에 이 천만 개의 데 이 터 를 삭 제 했 을 때 delete 문 구 는 높 은 수위 선 에 영향 을 주지 않 기 때문에 높 은 수위 선 은 여전히 천만 개의 데이터 에 있 습 니 다.이 럴 때 다시 selection 문 구 를 사용 하여 스 캔 을 합 니 다. 이 시간 표 에는 데이터 가 없 지만 스 캔 은 높 은 수위 선 에 따라 이 루어 지기 때문에 천만 개의 데이터 저장 공간 을 모두 스 캔 해 야 합 니 다. 즉, 이번 스 캔 에 필요 한 시간 은 천만 개의 데 이 터 를 스 캔 하 는 데 걸 리 는 시간 과 똑 같이 많 습 니 다.그래서 어떤 사람 은 항상 내 시계 에 데이터 가 몇 개 없 는데 도 이렇게 느 리 냐 고 말한다. 이때 사실은 비밀 이 바로 이곳 의 높 은 수위 선 이다.
 
그럼 높 은 수위 선 을 떨 어 뜨 릴 방법 이 없 을 까? 사실은 비교적 간단 한 방법 이 있 는데 그것 은 바로 TRUNCATE 문 구 를 이용 하여 데 이 터 를 삭제 하 는 것 이다.TRUNCATE 문 구 를 사용 하여 표 의 데 이 터 를 삭제 할 때 표 를 다시 만 드 는 것 과 유사 하 며 데 이 터 를 모두 삭 제 했 을 뿐만 아니 라 HWM 을 비 워 0 으로 복원 합 니 다.따라서 시 계 를 비 워 야 한다 면 TRUNCATE 문 구 를 이용 하여 데 이 터 를 삭제 할 수 있 을 때 TRUNCATE 문 구 를 이용 하여 시 계 를 삭제 합 니 다. 특히 그 데 이 터 는 양 이 많은 임시 저장 표 일 수 있 습 니 다.
 
수 동 세그먼트 공간 관리 (Manual Segment Space Management) 에 서 는 세그먼트 에 하나의 HWM 만 있 지만, Oracle 9i Release 1 에 추 가 된 자동 세그먼트 공간 관리 (Automatic Segment Space Management) 에 서 는 또 하나의 저 HWM 개념 이 나 왔 다.왜 HWM 이 있 고 또 하나의 낮은 HWM 이 있 습 니까? 이것 은 자동 세그먼트 공간 관리의 특성 으로 인해 생 긴 것 입 니 다.수단 세그먼트 공간 관리 에서 데이터 가 삽 입 된 후에 새로운 데이터 블록 에 삽입 되면 데이터 블록 은 자동 으로 포맷 되 어 데이터 접근 을 기다 리 게 됩 니 다.자동 세그먼트 공간 관리 에서 데이터 가 새로운 데이터 블록 에 삽 입 된 후에 데이터 블록 은 포맷 되 지 않 고 이 데이터 블록 에 처음 방 문 했 을 때 만 포맷 되 었 습 니 다.그래서 우 리 는 포맷 된 블록 을 표시 하기 위해 서 또 하나의 수위 선 이 필요 하 다.이 수위 선 을 저 HWM 이 라 고 한다.일반적으로 저 HWM 은 HWM 보다 낮 을 것 이다.
 
5. ORACLE 표 의 높 은 수위 선 을 수정 합 니 다.
ORACLE 에서 테이블 삭제 작업 을 실행 하면 이 테이블 의 높 은 수위 선 을 낮 추 지 않 습 니 다.전체 표 스 캔 은 한 단락 (extent) 의 높 은 수위 선 보다 낮은 블록 을 항상 읽 습 니 다.삭제 작업 을 수행 한 후 고수 위 선 표 시 를 낮 추 지 않 으 면 검색 어의 성능 이 떨어진다.아래 의 방법 은 모두 고수 위 선 표 시 를 낮 출 수 있다.
1. 테이블 재 구성 명령 실행 alter table tablename move;
(온라인 이동 테이블 공간 ALTER TABLE... MOVE TABLESPACE.이 공간 사용)
2. alter table 실행name shrink space; 이 명령 은 Oracle 10g 에 새로운 기능 을 추가 합 니 다. 이 명령 을 실행 하기 전에 alter table 이동 을 허용 해 야 합 니 다.name enable row movement;
3. 보존 할 데 이 터 를 임시 표 t, drop 원 표 로 복사 한 다음 에 임시 표 t 를 원 표 로 변경 합 니 다.
4.emp/imp
5.alter table table_name deallocate unused
6.truncate

좋은 웹페이지 즐겨찾기