> For the complete documentation index, see [llms.txt](https://docs.tibero.com/technical-guides/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/technical-guides/topics/installation/physical-design/index-size.md).

# 인덱스 크기 산정

Tibero DB 인덱스 크기 산정 방법에 대해 설명합니다.

## 사전 정보 <a href="#bookmark9" id="bookmark9"></a>

Tibero에서 인덱스 크기 산정에 필요한 사전 정보로 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정 정보가 필요합니다.

아래는 Key Column 총 길이, Base RowID 산정 기준 그리고 항목별 크기 산정의 예입니다.

### Key Column 총 길이 <a href="#id-3.1.1.-key-column" id="id-3.1.1.-key-column"></a>

인덱스 크기를 산정하기 위해서는 컬럼의 데이터 타입별 실제 소비 크기와 저장되는 길이을 산정해야하며 이 정보는 인덱스 크기를 산정하기 위한 항목별 크기 산정방법에 사용됩니다. 인덱스 크기를 산정할 때 컬럼에 지정된 데이터 타입별 저장되는 크기 산정이 필요합니다.

아래는 컬럼 정의 및 계산 방식의 예입니다. 크기 산정 테이블은 5개의 컬럼으로 구성되었다고 가정합니다.

<table data-header-hidden><thead><tr><th width="194"></th><th></th><th></th><th></th></tr></thead><tbody><tr><td><strong>이름</strong></td><td><strong>데이터타입</strong></td><td><strong>데이터길이</strong></td><td><strong>비고</strong></td></tr><tr><td>c1</td><td>CHAR(10)</td><td>10</td><td></td></tr><tr><td>c2</td><td>DATE</td><td>8</td><td></td></tr><tr><td>c3</td><td>NUMBER(7,2)</td><td>4</td><td>roundup(7/2)</td></tr><tr><td>c4</td><td>CHAR(500)</td><td>500</td><td></td></tr><tr><td>c5</td><td>VARCHAR(3000)</td><td>2,100</td><td>3,000*0,7</td></tr><tr><td><strong>Key Column 총 길이</strong></td><td></td><td>18</td><td>c1 + c2</td></tr></tbody></table>

"[데이터 타입별 크기 산정](/technical-guides/topics/installation/physical-design/data-type-size.md)"의 데이터 타입별 사이즈 표를 참고하여 위 테이블을 구성하는 각 컬럼의 데이터 타입별 실제 소비사이즈를 산정한 수치입니다. 자세한 항목별 수치 산정 방법은 "[Row의 데이터길이](https://docs.tibero.com/technical-guides/topics/installation/physical-design/pages/7PE2vH4lMoqSda9wwE4M#id-2.1.1.-row)"를 참고합니다.

### Base RowID 산정 기준 <a href="#id-3.1.2.-base-rowid" id="id-3.1.2.-base-rowid"></a>

크기 선정 대상인 위 테이블의 인덱스는 Local Index와 Not Unique Index로 선별 되었습니다.

<table data-header-hidden><thead><tr><th></th><th width="174"></th><th width="138"></th><th></th></tr></thead><tbody><tr><td><strong>Name</strong></td><td><strong>Type</strong></td><td><strong>데이터길이</strong></td><td><strong>비고</strong></td></tr><tr><td>A</td><td>Global Index</td><td>10</td><td>Global, Local 선별</td></tr><tr><td></td><td>Unique Index</td><td>6</td><td>Global, Local 선별</td></tr><tr><td>B</td><td>Unique Index</td><td>0</td><td>Unique, Not Unique 선별</td></tr><tr><td></td><td>Not Unique Index</td><td>1</td><td>Unique, Not Unique 선별</td></tr><tr><td><strong>Base RowID 총 길이</strong></td><td></td><td>8</td><td>A + B의 합계</td></tr></tbody></table>

### 항목별 크기 산정 <a href="#id-3.1.3" id="id-3.1.3"></a>

인덱스 크기를 산정하기 위해 필요한 항목은  아래와같습니다.

크기 예는 각 항목별로 기본으로 정해진 크기, 파라미터로 설정할 수 있는 크기와 운영할 시스템에서 사전 조사된 수 치를 나타냅니다.

<table data-header-hidden><thead><tr><th width="218"></th><th width="106"></th><th width="81"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>크기 예</strong></td><td><strong>단위</strong></td><td><strong>설명</strong></td></tr><tr><td>Row Directory</td><td>2</td><td>bytes</td><td>기본값: 2</td></tr><tr><td>Index Header</td><td>2</td><td>bytes</td><td>기본값: 2</td></tr><tr><td>250bytes 이하 컬럼 개수</td><td>2</td><td>개수</td><td>위의 Key Column 총 길이 테이블에 c1, c2 가 대상이다.</td></tr><tr><td>250bytes 초과 컬럼 개수</td><td>0</td><td>개수</td><td></td></tr><tr><td>Block Size</td><td>8192</td><td>개수</td><td>기본값: 8192 (파라미터)</td></tr><tr><td>Block Header</td><td>224</td><td>bytes</td><td></td></tr><tr><td>INITRANS</td><td>2</td><td>개수</td><td>기본값: 2 (파라미터)</td></tr><tr><td>PCTFREE</td><td>10</td><td>%</td><td>기본값: 10% (파라미터)</td></tr><tr><td>ITL공간</td><td>48</td><td>bytes</td><td>24 * 2 (24 * INITRANS)</td></tr><tr><td>초기 예상 건수</td><td>100,000</td><td>Rows</td><td>사용자 환경</td></tr><tr><td>월중 예상 추가 건수</td><td>20,000</td><td>Rows</td><td>사용자 환경</td></tr><tr><td>데이터 보관 월 수</td><td>120</td><td>개월</td><td>사용자 환경</td></tr><tr><td>Base RowID</td><td>7</td><td>bytes</td><td>6 + 1</td></tr></tbody></table>

###

***

## 인덱스 크기 산정방법 <a href="#bookmark10" id="bookmark10"></a>

본 절에서는 Tibero에서 인덱스 크기를 산정하는 방법을 설명합니다.

### 한 Index Entry의 저장에 필요한 공간 <a href="#id-3.2.1.-index-entry" id="id-3.2.1.-index-entry"></a>

#### 산정 공식

```
Row Directory + Index Header + Base RowID
+ Key Column 총 길이 + (1 * <250bytes 이하 컬럼개수>) + (3 * <250bytes 초과 컬럼개수>)
```

<table data-header-hidden><thead><tr><th></th><th width="140"></th><th width="128"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>Row Directory</td><td>2</td><td>2</td><td></td></tr><tr><td>Index Header</td><td>2</td><td>2</td><td></td></tr><tr><td>Base RowID</td><td>7 7</td><td>6 +1</td><td></td></tr><tr><td>Key Column 총 길이</td><td>18</td><td>18</td><td></td></tr><tr><td>250bytes 이하 컬럼개수</td><td>2</td><td>1 * 2</td><td>1 * 250bytes 이하 컬럼개수</td></tr><tr><td>250bytes 초과 컬럼개수</td><td>0</td><td>3 * 0</td><td>3 * 250bytes 초과 컬럼개수</td></tr><tr><td><strong>Index Entry Space</strong></td><td></td><td>31</td><td>2+2+7+18+(1*2)+(3*0)</td></tr></tbody></table>

### 한 블록의 데이터 공간 <a href="#id-3.2.2" id="id-3.2.2"></a>

#### 산정 공식

```
(Block Size - Block Header - ITL 공간) * (100 - PCTFREE) / 100
```

<table data-header-hidden><thead><tr><th width="217"></th><th width="136"></th><th width="139"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>Block Size</td><td>8192</td><td>8192</td><td></td></tr><tr><td>Block Header</td><td>224</td><td>224</td><td></td></tr><tr><td>ITL공간</td><td>48</td><td>48</td><td>24 * 2 (24 * INITRANS)</td></tr><tr><td>PCTFREE</td><td>10</td><td>10</td><td></td></tr><tr><td><strong>Data Space per Block</strong></td><td></td><td>7,128</td><td>(8192-224-48)*(100-10)/100</td></tr></tbody></table>

### 한 블록에 들어가는 Entry 개수 <a href="#id-3.2.3.-entry" id="id-3.2.3.-entry"></a>

#### 산정 공식

```
/Data Space per Block / Index Entry Space (한 블록의 데이터 공간
/ 한 Index Entry의 저장에 필요한 공간)
```

<table data-header-hidden><thead><tr><th width="226"></th><th width="129"></th><th width="132"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>Data Space per Block</td><td>7,128</td><td>7,128</td><td></td></tr><tr><td>Index Entry Space</td><td>31</td><td>31</td><td></td></tr><tr><td><strong>Entry Size per Block</strong></td><td></td><td>229.9355</td><td>7,128 / 31</td></tr></tbody></table>

### 총 데이터 Row 개수 <a href="#id-3.2.4.-row" id="id-3.2.4.-row"></a>

#### 산정 공식

```
초기 예상 건수 + 월중 예상 추가 건수 * (데이터 보관 월 수 + 1)
```

<table data-header-hidden><thead><tr><th></th><th width="136"></th><th width="126"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>초기 예상 건수</td><td>100,000</td><td>100,000</td><td></td></tr><tr><td>월중 예상 추가 건수</td><td>20,000</td><td>20,000</td><td></td></tr><tr><td>데이터 보관 월 수</td><td>120</td><td>120+1</td><td>&#x3C;데이터 보관 월 수> + 1</td></tr><tr><td><strong>Total Row Size</strong></td><td></td><td>2,520,000</td><td>100,000 + 20,000 * (120+1)</td></tr></tbody></table>

### Index Leaf 블록에 필요한 Index Branch 블록의 비율 <a href="#id-3.2.5.-index-leaf-index-branch" id="id-3.2.5.-index-leaf-index-branch"></a>

Leaf Block 일정수마다 Branch Block이 생성됩니다.

"[필요한 총 데이터 공간](#id-3.2.6)"의 산정방식 (Block Size \* (A+B)) 중 A는 Leaf Block을 B는 Branch Block을 의미합니다.&#x20;

#### 산정 공식

```
1 / Entry Size per Block (1 / 한 블록에 들어가는 Entry 개수)
```

<table data-header-hidden><thead><tr><th width="214"></th><th></th><th></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>Entry Size per Block</td><td>229.9355</td><td>229.9355</td><td></td></tr><tr><td><strong>Index Branch Ratio</strong></td><td></td><td>0.004349046</td><td>1 / 229.9355</td></tr></tbody></table>

### 필요한 총 데이터 공간 <a href="#id-3.2.6" id="id-3.2.6"></a>

#### 산정 공식

```
Block Size *( Total Row Size / Entry Size per Block + Total Row Size
/ Entry Size per Block ^ 2 )
```

<table data-header-hidden><thead><tr><th width="170"></th><th width="129"></th><th width="136"></th><th></th></tr></thead><tbody><tr><td><strong>항목</strong></td><td><strong>사전 정보 크기</strong></td><td><strong>실제 저장 크기</strong></td><td><strong>비고</strong></td></tr><tr><td>Block Size</td><td>8,192</td><td>8,192</td><td></td></tr><tr><td>Total Row Size</td><td>2,520,000</td><td>2,520,000</td><td></td></tr><tr><td><p>Entry Size </p><p>per Block</p></td><td>229.9355</td><td>229.9355</td><td></td></tr><tr><td><strong>Total Index Size</strong></td><td></td><td>90,161,152</td><td><p>8192*(TRUNC(2520000/229.9355,0)</p><p>+TRUNC(2520000/229.9355^2,0))</p></td></tr></tbody></table>

### Index Split이 일어난 경우 <a href="#id-3.2.7.-index-split" id="id-3.2.7.-index-split"></a>

Index Split이 일어난 경우 실제 블록의 50% 공간만 차지하게 되므로 사용 공간 최대 값은 최종 계산 결과 \* 2를 해 줍니다.&#x20;

1. 인덱스의 경우 Create Index로 데이터를 처음 적재하는 경우 PCTFREE로 지정된 비율을 제외하고 블록을 최 대한 사용하여 데이터를 저장합니다.
2. 인덱스 생성 이후 신규로 인덱스 키 데이터가 추가되는 경우 해당 인덱스 키가 추가되어야 하는 블록에 여유 공 간이 없을 때 SPLIT이 발생하게 됩니다.
3. SPLIT이 발생하게 되면 새로운 블록이 할당되고 기존 블록에 있던 인덱스 키 데이터를 통상 5:5 비율로 분할하 여 나누어 가지기 때문에 두 개의 블록에 빈 공간이 50% 생깁니다.

따라서, 인덱스에 데이터 추가가 계속된다고 하면 특정 시점 이후에 Index Split이 얼마나 발생했는지는 정확하게 예측하기는 어렵습니다. 다만, 처음 SPLIT이 발생된 이후, 다음 번 SPLIT이 발생되기까지 빈 공간이 0% \~ 50% 범위에서 유지되기 때문에 평균적으로 절반 정도의 블록이 SPLIT이 되어 있다라고 가정하는 것이 가장 근사하게 추정하는 방법일 것입니다.

Index Size시트의 크기 산정 방식에서 최종 계산 결과(Total Table Size for Index Spli)에 2를 곱한 것은 모 든 블록이 SPLIT되어 있을 때 최대 사용공간을 가정하여 산출한것이며 만약 평균 개념으로 추정한다면 1.5를 곱해서 계산하는 것이 현실적일 수 있습니다.

#### 산정 공식

```
Index Split이 일어난 경우 데이터 공간 = Total Index Size * 2 (필요한 총 데이터 공간 * 2 )
```

| **항목**                               | **사전 정보 크기** | **실제 저장 크기** | **비고**         |
| ------------------------------------ | ------------ | ------------ | -------------- |
| Total Index Size                     | 90,161,152   | 90,161,152   |                |
| **Total Index Size for Index Split** |              | 180,322,304  | 90,161,152 \*2 |

###
