[출처] http://blog.naver.com/kiyoun82?Redirect=Log&logNo=110069699348
* 공간 관리의 3단계
- Files [ OS 의 files? ASM 의 files? raw paritions 의 files? ] 들을 tablespace 에서 disk 로 할당
: SAME 방식 (중요 고민거리...) (Striping And Mirroring Everything)
- Extent : 크기 결정 (중요 고민거리...)
- BlcoKs : Size / 가득 채우기 / Migration
* LMT 와 DMT 는 10g workshop 앞부분 복습하기... 6장쯤...
* Locally Managed Extents
- Create a locally managed tablespace :
SQL) CREATE TABLESPACE user_data_1
2 DATAFILE '/home/oracle/oradata/orcl/lm_1.dbf' size 100m
3 extent management local [ (auto allocate) 가 되는 것 ] <- LMT 지정
4 uniform size 2m;
% SYSTEM tablespace 가 DMT 이면 그 외 TS 생성시 DMT 와 LMT 둘 다 가능
LMT 이면 그 외 TS 생성시 모두 LMT 가 되어진다.
% 수동 DB 를 만들면 SYSTEM TS 는 DMT 로 생성
자동 DB(DBCA) 로 만들면 SYSTEM TS 는 LMT 로 생성 되어진다.
* Large Extents
Pros (찬) | Cons (반) |
- 동적으로 Extend 크기를 변환할 수 있다. | - 금새 용량이 바닥이 난다. |
- performance 에 조그마한 이익이 있다. |
- 사용안되어지는 부분을 포함하여 공간 낭비가 있다. |
- Enable the server process to read(멀티블럭) the entire extent map with a single I/O operation ( server 는 extent max 과 single I/O 를 사용) |
% extent map : segment header 에 extent map 즉 시작과 끝에 대한 정보가 들어 잇따.
* SYSTEM Tablespace 를 LMT 로 만들기.
- SQL) EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('SYSTEM');
: 이것을 하기 전에 대한 준비 요구 조건
- 요구 조건.
: system 은 RESTRICTED mode 여야 하고,
: SYSTEM , UNDO , TEMP 를 제외한 TS 들을 Read only mode 여야 한다.
: 나머지를 redo only 로 바꾸고 위에 3개의 TS 를 read only mode 로 해 주어야 한다.
: 위의 package 를 성공 하지 못했을 경우 만날 수 있는 ora 에러들.
->ORA-03240 : User's temporary tablespace same as tablespace being migrated
->ORA-10642 : Found rollback segments in dictionary managed tablespace
[ DMT 안에 롤백 segment 없어야 한다.]
->ORA-10643 : Database shoud be mounted in restricted mode and Exclusive mode
[ database 는 mount 에서 restricted mode 나 exclusive mode 여야 한다.]
->ORA-10644 : SYSTEM tablespace cannot be default temporary tablespace
[ SYSTEM TS 는 temp TS 가 default 일 수 없다.]
% LMT 로 바꾸면 DMT 로 바꿀 수 없다.
% 9i 전까지 temporary TS 의 default 는 SYSTEM TS 였다.
-> 그 이유는 명명된 (이름이 명시된) TS 는 system 뿐이 없었기 때문!!
* Database Block
- Block header : segment type ( table 이냐 index냐 ) / data block address(DBA) / table dictionary /
row dictionary (row 위치, row 하나하나당 2byte 정도 소모) / transaction slot (개당 23 byte) 등 저장.
header 는 Top-down 방식
- Row data : actual data (Bottom up 방식)
- Free space : 중간의 영역. header 와 row data 가 자라는 공간이 된다.
* Minimize Block Visit [ block 방문 횟수 적게 만들려면..]
1) Using a larger block size [ block size 크게 만들기]
2) Packing rows as closely as possible into block [하나의 블럭에 많은 row 넣기 / pctused,pctfree 사용]
3) row migration 방지
% 1)과 2) 를 하게 되면 block 경합이 많이 발생하게 된다.
% 2) 하나의 블럭에 많은 row 를 넣게 되면, 3)의 row migration 의 발생 확률이 높아진다.
=> 즉 상충 되는 이야기가 되기에 많이 고민하고 결정 하여야 한다.
* DB_BLOCK_SIZE parameter
- DB 생성시 한번 정해 주면 다시는 바꿀 수 없다.
- OS block 의 정부배가 되어야 한다. (OS 블럭이 4k 라며 오라클 블럭은 8k 이렇게 되어야 한다. 작을 수 없다.)
- I/O size 와 같거나 작아야 한다. (I/O size 가 16k 라면 오라클은 16k 와 같거나 작아야 한다.
*
Small Block Size |
Large Block Size |
* Advantaged (혜택) |
* Advantaged (혜택) |
- block 경합을 줄일 수 있다. | - 공간에 대한 overhead 가 적다. [free list 줄고] |
- 길이가 짧은 로우들에 좋다. | - sezuential access 에 좋다.[scan 에 좋다.] |
- random access 에 좋다. | - very large row 도 가능 |
* Disadvantaged ( 불합리) | - index reads 에 뛰어난 performance 를 보인다. |
- large space 에는 overhead 발생 | * Disadvantaged ( 불합리) |
- 블럭당 row 를 몇 개 넣지 못한다. | - block 경합이 높아진다. |
- 같은 양의 I/O 가 있을 때에는 I/O 가 높아진다. | - 메모리 낭비[block이 8k row가 2 byte 면 7950byte 낭비) |
* Performance |
* Performance |
- OLPT 환경에는 small blocks 가 더 좋다 | - OLAP ,DSS ,DW, ,BI 등에 좋다 |
* Block Allocation
- 공간을 필요로 하면 적절한 크기가 할당 되어져야 한다.
- 할당 방식
1. Free lists 2. ASSM [Automatic Segment Space Management]
% 나쁜점 :
PCTUSED 높여주면 BLOCK 을 꽉 채울 수는 있지만 조금만 지워져도 다시 free list 에 들어가서
자리를 차지하게 된다. insert 하려고 하는데 남아있는 용량이 별로 되지도 않는 애들 (pctused 가 높아서 온 block들)이
기다리고 있으니깐 이것들 때문에 wait 와 I/O 가 발생 하게 된다.
* Free list
-- Master list / Process list / Transaction list
- Segment header 에 free list 를 이루는 다음 블럭의 주소를 가지고 있다.
* Block Space Management
SQL) create talbe t1 (no1 number, no2 number)
2 pctfree 20 pctused 40 initrans 2 maxtrans 5 -> Block space utilization 파라미터
3 stroage (buffer_pool keep freelists 2)
[예전 3> stroage (initial 64k next 64k buffer_pool keep freelists 2) ]
[만일 4 tablespace users; 이렇게 해준다면 파란색의 값들만 인식 하고 나머지는 무시하게 된다.]
% [ free lists 에 쓰여진 2, 3 은 추천 / 1(한개는)은 경합이 높아져서 별로 안좋다.]
- For an index
: PCTFREE : 새로 들어올 엔트리에 대한 공간 (중간중간 들어올 insert 를 위한 공간)
: PCTUSED : 항상 0 으로 사용되어 지지 않는다.
- For a table
: PCTFREE : row update 를 위한 예약 공간
: PCTUSED : free space 의 제일 작은 단계
* ASSM
- tablespace level 상태여야 한다.
- LMT 로 되어있어야 한다.
- ASSM 을 사용할 시에는 PCTUSED , PCTFREE , FREELIST GROUPs 는 무시된다.
- Free-list segment 의 default 는 MANUAL 이다.
* Migration $ Chaining
(workshop 1 볼 것!)
* Migration 예방하기
- PCTFREE
: default : 10
: undate 가 없는 곳에서는 0 으로 설정 [ 블록의 사용율을 확대 시키려고]
: pctfee = 100 * UPD / (average row length)
UPD : Average amount aded by updates, in bytes.
- PCTUSED
: 오직 free list 만을 위한곳
: default : 40
: pctused = 100 - pctfree - ( 100 * rows * average row length / block size )
rows ] if 1, 이라면 insert 불가능에서 가능으로 변했을 때 평균 레코드 1개 받아들일 수 있는 여유
2, 3 이 됬을 때 insert 가능하게 되는 여유.
% migration 이나 chaining 은 전체에 20~30 % 정도까지는 봐줄만 하다고 한다.
---------------------------------------------------------------------------------------------------------
* Migration 해결 방법
- Export / Import :
- export the table
- drop or truncate the table
- import the table
- Move table command :
- ALTER TABLE EMPLOYEES MOVE
- Online table redefinition 재생성
-----------------------------------여기까지는 전체 이동 다음 부터는 문제 있는 애들만 이동
- copy migrate rows
- Analyze 를 사용하여 migration 된 것을 찾는다.
- 새로운 table 에 migration 된 row 들을 copy 한다.
- 원본 table 에서 migration row 를 삭제 한다.
- 원본 table 에 new table 을 copy 한다.
% 책 14-31 참조.
Database Block Size |
Recommended Maximum Number of Extents |
2KB |
100,000 |
4KB |
200,000 |
8KB |
400,000 |
16KB |
800,000 |
'OraclE' 카테고리의 다른 글
DBMS_STATS (0) | 2012.06.13 |
---|---|
DBMS_STATS 패키지 (0) | 2012.06.13 |
ALTER TABLE 에 있어서의 SHRINK 와 MOVE (10g) (0) | 2012.06.13 |
[펌] INBOUND_CONNECT_TIMEOUT (0) | 2011.09.15 |
Resumable Space Allocation (0) | 2011.01.27 |