테이블 크기 산정 방법
{
테이블 사이즈 산정 방법 개요
테이블 사이즈 산정 수순은 크게 다음과 같다.
(수순1)1레코드의 평균 길이를 구한다.
(수순2)1블럭에 들어가는 레코드 수를 구한다.
(수순3)CEIL(예상 레코드수-(수순2)의 값)×블럭 사이즈 =테이블 용량
CEIL은 지정한 수보다 같거나 큰 최소 정수를 반환하는 함수.
한 레코드의 평균 길이를 구하는 방법
레코드는 크게 그림과 같은 이미지로 저장되어진다. 레코드는 레코드 헤더가 하나와 각열의 헤더 및 열 데이터로 구성된다.
레코드헤더 | 열헤더 | 열헤더 | 열헤더 | 열헤더 | 열헤더 | 열헤더 |
(1)레코드 헤더의 사이즈
(2)열 헤더의 사이즈
(3)열 데이터의 사이즈
데이터 형 | 고정/가변 | 테이터가 격납될때의 길이 |
---|---|---|
CHAR | 고정/가변 |
|
VARCHAR2 | 가변 | 실제로 저장되어 있는 데이터의 길이(바이트지정시,문자지정시) |
NCHAR | 고정 | 테이블정의문자의 두배(AL16UTF16지정시) |
NVARCHAR2 | 가변 | 저장문자의 두배(AL16UTF16지정시) |
NUMBER | 가변 | 길이 = 1 + CEIL (n / 2)
|
DATE | 고정 | 7바이트 |
TIMESTAMP | 가변 | 초의 소수부에 데이터가 있는 경우:11바이트 고정 초의 소수부에 데이터가 없는 경우:7바이트 고정 |
TIMESTAMP WITH TIME ZONE | 고정 | 13바이트 |
TIMESTAMP WITH LOCAL TIME ZONE | 고정 | 11바이트 |
INTERVAL YEAR TO MONTH | 고정 | 5바이트 |
INTERVAL DAY TO SECOND | 고정 | 11바이트 |
RAW | 가변 | 실제로 저장되어 있는 데이터의 길이 |
LONG | 가변 | 실제로 저장되어 있는 데이터의 길이 |
LONG RAW | 가변 | 실제로 저장되어 있는 데이터의 길이 |
BLOB/CLOB/NCLOB | 지정에의해함 |
|
BFILE | 고정 | 530바이트 |
ROWID | 고정 | 6바이트(~Oracle7) 10바이트(Oracle8~) |
한 블럭에 들어가는 레코드수 구하는 법
DB 블록의 구조는 대략적으로는 그림 2대로입니다. 블록은 블록 헤더와 데이터 격납부 , 그리고 테이블 파라미터 PCTFREE의 지정으로 확보한 예비 영역으로 구성됩니다. 블럭헤더 사이즈는 이하의 계산식을 이용해 구할수 있습니다. INITRANS는 테이블 파라메터이다. 헤더의 사이즈 = 90 + (INITRANS - 1) (2)예비영역 사이즈 예비영역의 사이즈는 이하의 계산식을 이용해 구할수 있습니다.CEIL은 지정한 수보다 같거나 큰 최소 정수를 반환하는 함수.PCTFREE는 테이블 파라미터입니다. PCTFREE는 단위가%이므로 , 계산때는 소수로 고친다 예비영역사이즈 = CEIL((테이블 격납처의 테이블 스페이스의 블럭사이즈 - 헤더사이즈) × PCTFREE) (3)데이터 격납부의 사이즈 데이터 격납부의 사이즈는 이하의 계산식을 이용해 구할수 있다. 데이터 격납부 사이즈 = 테이블 격납처의 테이블 스테이스 블럭사이즈-헤더사이즈-예비 영역사이즈 위의 값을、 TRUNC(데이터 격납부 사이즈 ÷ 평균레코드 길이) 가 한 블럭에 들어가는 레코드수가 된다. |
|
평균 레코드 길이가 데이터 격납부보다 긴 경우의 산정 방법
평균 레코드 길이가 데이터 격납부보다 긴 경우 , 당연히 레코드는 복수의 블록에 걸쳐 격납됩니다. 이 상태를 행 연쇄라고 부릅니다. 행 연쇄가 발생하는 평균 레코드 길이의 경우의 테이블 용량의 견적은、
가 됩니다. CEIL은 지정한 수보다 같거나 큰 최소 정수를 반환하는 함수.데이터 격납부의 계산때는 , PCTFREE는 실제의 지정에 관련되지 않고 0으로서 계산해 주세요. 그리고 , 이 견적 방법은 레코드의 사이즈의 격차가 적은 경우는 유효합니다만 , 불규칙한 경우는 실제의 레코드의 격납순서에 열매 격납 사이즈가 큰폭으로 영향을 받기 때문에 , 꽤 큰 견적이 되어 버릴 가능성이 있습니다.
LOB데이터의 산정방법
LOB테이블의 산정은 아래의 수순으로 한다.
(수순1)CHUNK치를 블럭사이즈의 배수로 절상
(수순2)평균LOB길이를 수순1의 배수로 절상한다.
(수순3)LOB격납 영역의 사이즈 구하기
(수순4)RETENTION(PCTVERSION)영역 구하기
(수순5)수순3과 수순4의 합계가 LOB테이블의 용량이 된다.
◆ 第2章 테이블 용량 산정 예 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
레코드가 한블럭에 들어가는 길이의 경우의 산정 SCOTT스키마에 있는 EMP테이블을 예로 산정을 해본다. 예상건수는 10,000건으로 한다. EMP테이블의 정의는 다음과 같다.
(1)평균레코드길이 구하기 가변길이의 데이터형의 평균 데이터 길이는 , NUMBER형에 대해서는 정밀도 그대로의 데이터 길이 , VARCHAR2형에 대해서는 정의 데이터 길이의 7할이 가정합니다. 계산 근거는 표 1을 참조.
(2)1블럭에 들어가는 레코드 수 구하기 필요한 테이블 파라메터는 전부 디폴트로 설정하였다. 블럭 사이즈는 8KB(8,192바이트)로 설정
1블록중에서 실제로 데이터를 격납할 수 있는 영역이 7,291바이트가 구해졌으므로 , 이것을 (1) 에서 구한 평균 레코드 길이 50바이트로 나누 (나머진 버림) 면 1블록에 146건 들어가는 것을 알 수 있다 (3)테이블 용량 구하기 이미 접했지만 、(2)로부터의 테이블의 용량은 예상레코드수 ÷ (2)의 값 × 블럭 사이즈 가 되고 실제로 계산해보면 CEIL(10,000 / 146) * 8,192 = 565,248byte = 552kb 가 된다.
블록 사이즈 8KB에 대해서 VARACHAR2(3000) 의 3열의 레코드가 10,000건 삽입되는 테이블의 용량을 추측합니다. 데이터는 어느 열도 항상 3,000바이트 들어오는 것으로 합니다. 레코드길이는 (3,000 + 3(열 해더)) * 3(열) + 3(레코드 헤더) = 9,012바이트가 된다. (2)데이터 격납부의 사이즈 구하기 레코드가 블러거에 들어가는 케이스랑 똑같이 전제하면 7,291바이트가 된다. (3)테이블 용량 구하기 이와 같은 케이스의 테이블 용량의 계산방법은 이므로、CEIL(평균 레코드 길이 ÷ 데이터 격납부의 길이 ) × 예상 레코드수 × 블록 사이즈 CEIL(9,012 / 7,291) * 10,000 * 8,192 = 163,840,000바이트 = 약 157메가바이트 LOB테이블의 용량 산정 블럭사이즈가 8KB인 경우 평균 1메가의 LOB를 1000건 격납하는 LOB테이블의 용량 산정예이다. RETENTION로 필요한 영역은 LOB격남영역의 20%、DISABLE STORAGE IN ROW지정으로 1000건 모두가 LOB테이블에 격남되어 있다라고 가정 CHUNK는 3KB로 한다. (1)CHUNK의 값을 블록 사이즈의 배수에 절상 CHUNK가3KB이고 블럭사이즈가 8KB이므로 8KB가 된다.
(3)LOB격납영역의 사이즈 구하기 LOB격납영역의 사이즈는 LOB격납영역 = (2)의 값 × 예상 레코드수 이므로 1,048,576 * 1,000 = 1,048,576,000바이트 = 1,000메가바이트 가 된다. (4)RETENTION영역을 구한후 더해 테이블 용량이 된다. RETENTION영역은 LOB격납영역의 20%이므로 (3)의 값을 1.2배 한1,200 메가바이트가 산정결과가 된다. |
◆ 第3章 컬럼의 나열순서의 기본지침 | |
컬럼의 나열순서의 기본지침 컬럼의 나열순서는 기본적으로 관리하기 쉽도록.을 염두해 두고 설계합시다. 예를들어 아래의 항목을 유념합니다.
레코드 길이를 줄이는 테크닉 레코드 길이를 가능한 짧게하면 할수록, 블럭당 저장할수 있는 레코드의 수가 많아 진다.그렇게 하면 캐쉬히트율이 높아지고 용량의 절약도 가능해 진다. (1)가변길이 테이터형 이용 예를들어 우편번호같이 자릿수가 정해져 있는 데이터형을 제외하고는 VARCHAR2와 같은 가변길이를 사용하자. 정의된 길이에 비해 실데이터가 작으면 작을수록 용량을 절약할수 있다. (2)SJIS이용 일본어의 데이터 저장효율(용량절약)의 관점에서 케릭터셋에 SJIS을이용하는것이 제일좋다.단 국제화 대응이나 이용 플랫폼과의 친화성이란 관점도 있으므로 일본어 데이터의 저장효율의 관점에서만 케릭터셋을 결정해서는 안될것이다. (3)NULL이 저장되기 쉬운 컬럼을 뒤에 정의한다. NULL이될 경유가 많은 컬럼은 모아서 뒷쪽에 배치하면 열 헤더가 생략되기때문에 레코드 길이를 줄일수 있다. |
출처 : http://blog.daum.net/cjsxowls/11391978
}
'wif LiNoUz > Oracle,Sql' 카테고리의 다른 글
Undo 정리 (1) | 2014.06.19 |
---|---|
인덱스 파티셔닝 (0) | 2014.06.18 |
INDEX (0) | 2014.06.18 |
DELETE LOOP (0) | 2014.06.17 |
dw에서는 로컬인덱스가 일반적 (0) | 2014.06.16 |