IOT 구조와 성능: Primary Key Leaf·Overflow·Secondary Index
Index-Organized Table이 Primary Key B*Tree Leaf에 행을 저장하는 구조와 Overflow·Secondary Index의 Logical ROWID 비용을 이해합니다.
핵심 요약
IOT(Index-Organized Table)는 Table Row 자체를 Primary Key B-tree의 Leaf Block에 저장하는 Table 구조입니다.
Heap Table + Primary Key Index
Primary Key Index Leaf
→ Key + Physical ROWID
Physical ROWID
→ Heap Table Block
→ Row Data
Index-Organized Table
Primary Key B-tree Leaf
→ Primary Key
→ Non-Key Row Data
→ 필요 시 Overflow 위치 정보
Heap Table은 Primary Key Index와 Table Row Segment가 분리되지만, IOT는 Primary Key Index가 곧 Row 저장 구조입니다.
IOT
= Primary Key B-tree
+ Table Row Data
대표 이점입니다.
- Primary Key 단건 조회에서 별도 Heap Block Access를 줄일 수 있음
- Primary Key 또는 유효한 선두 Prefix Range에서 관련 Row가 Key 순서로 저장됨
- 별도 Primary Key Index Segment의 Key·ROWID 중복 저장을 피함
대표 비용입니다.
- 넓은 Row 때문에 Leaf Entry·Leaf Block·B-tree 높이가 증가할 수 있음
- 무작위 Primary Key Insert·Key Update로 Block Split과 Redo가 증가할 수 있음
- Overflow Column 조회 시 추가 Segment Access가 발생
- Secondary Index는 Physical ROWID 대신 Logical ROWID를 사용하므로 Primary Key 길이와 Physical Guess 정확도가 비용에 영향을 줌
이 이론의 범위
이 이론은 SQLP의
SQL 고급활용 및 튜닝 → 인덱스 튜닝 → 테이블 액세스 최소화범위에서 IOT의 Primary Key Leaf 저장, Overflow, Secondary Index Logical ROWID와 Heap Table 비교를 다룹니다.
학습 목표
이 이론을 학습한 뒤에는 다음을 설명할 수 있어야 합니다.
- Heap-Organized Table과 IOT의 Row 저장 구조를 비교한다.
- IOT에서 Primary Key Constraint가 필수인 이유를 설명한다.
- Primary Key 단건·Prefix Range 조회에서 Table Access가 줄어드는 원리를 설명한다.
- IOT Full Scan이 Full Index Scan·Fast Full Index Scan 형태가 될 수 있음을 설명한다.
PCTTHRESHOLD,INCLUDING,OVERFLOW의 역할과 우선순위를 설명한다.- Overflow Head Piece·Tail Piece와 추가 접근 비용을 설명한다.
- Secondary Index의 Logical ROWID와 Physical Guess를 설명한다.
- 정확한 Guess와 오래된 Guess의 접근 비용 차이를 설명한다.
PCT_DIRECT_ACCESS의 의미와 한계를 설명한다.- Bitmap Secondary Index에 Mapping Table이 필요한 이유를 설명한다.
- Primary Key 길이·변경·무작위 Insert가 IOT DML 비용에 미치는 영향을 설명한다.
- Heap Table과 IOT를 Runtime 통계·Segment·DML 비용으로 비교한다.
1. Heap Table과 IOT 구조 비교
1.1 Heap-Organized Table
Heap Table은 Row를 빈 공간이 있는 Table Block에 저장합니다. Primary Key Index Leaf에는 일반적으로 Key와 Physical ROWID가 저장됩니다.
Primary Key Index Leaf
(account_id=100, ROWID=AA...)
↓
Heap Table Block
(account_id=100,
balance=50000,
updated_at=...,
memo=...)
Primary Key 조회의 일반적인 실행 경로입니다.
INDEX UNIQUE SCAN ACCOUNT_BALANCE_PK
→ Physical ROWID
TABLE ACCESS BY INDEX ROWID ACCOUNT_BALANCE
→ Row Data
1.2 Index-Organized Table
IOT는 Primary Key B-tree Leaf에 Row Data를 함께 저장합니다.
IOT Primary Key Leaf
(account_id=100,
balance=50000,
updated_at=...,
memo=...)
Primary Key 탐색
→ Leaf Entry 발견
→ Leaf에서 Row Data 반환
별도 Heap Table Segment의 Row를 찾는 단계가 없습니다.
1.3 Data Dictionary 확인
SELECT table_name,
iot_type,
iot_name,
num_rows,
blocks,
avg_row_len,
last_analyzed
FROM user_tables
WHERE table_name LIKE 'ACCOUNT%';
대표 값입니다.
IOT_TYPE = IOT
→ IOT Top Object
IOT_TYPE = IOT_OVERFLOW
→ Overflow Segment에 대응하는 내부 Table Object
IOT_TYPE = IOT_MAPPING
→ Bitmap Secondary Index용 Mapping Table
IOT Primary Key 저장 구조는 Index Dictionary에서 다음처럼 확인할 수 있습니다.
SELECT index_name,
index_type,
uniqueness,
blevel,
leaf_blocks,
clustering_factor,
last_analyzed
FROM user_indexes
WHERE table_name = 'ACCOUNT_BALANCE';
INDEX_TYPE = IOT - TOP
2. Primary Key가 반드시 필요한 이유
IOT는 Primary Key 순서로 Row를 저장합니다.
Primary Key
= Row의 논리적 식별자
+ B-tree 정렬 Key
+ Leaf에서 Row를 찾는 Access Key
+ Secondary Index Logical ROWID의 기반
따라서 IOT에는 Primary Key Constraint가 반드시 필요합니다.
CREATE TABLE account_balance (
account_id NUMBER NOT NULL,
balance NUMBER NOT NULL,
updated_at TIMESTAMP NOT NULL,
memo VARCHAR2(500),
CONSTRAINT account_balance_pk
PRIMARY KEY (account_id)
)
ORGANIZATION INDEX;
IOT는 단순히 Heap Table에 Primary Key Index를 하나 추가한 구조가 아닙니다.
Heap Table
Table Row Segment 존재
PK Index는 선택적 별도 Segment
IOT
Table Row가 PK B-tree Leaf에 존재
PK 구조가 Table의 핵심 저장 구조
3. Primary Key 단건 조회
SELECT balance,
updated_at
FROM account_balance
WHERE account_id = :account_id;
Heap Table 후보입니다.
INDEX UNIQUE SCAN
→ TABLE ACCESS BY INDEX ROWID
IOT 후보입니다.
INDEX UNIQUE SCAN SYS_IOT_TOP_...
→ Leaf에서 balance·updated_at 반환
IOT의 이점은 다음 단계 제거에서 발생합니다.
Heap
PK Index Block
+ Heap Table Block
IOT
IOT Primary Key Leaf Block
단건 조회가 한 번 빠른 것만으로 설계를 확정하지 않습니다.
- Buffer Cache Hit 여부
- Leaf Block 수·BLEVEL
- Row 폭
- DML 빈도
- Secondary Index 사용량
- Data 증가 이후 Split
- Overflow Column 조회 비율
을 함께 검증합니다.
4. Primary Key Prefix Range 조회
복합 Primary Key IOT를 가정합니다.
CREATE TABLE account_txn (
account_id NUMBER NOT NULL,
txn_seq NUMBER NOT NULL,
txn_time TIMESTAMP NOT NULL,
amount NUMBER NOT NULL,
txn_type VARCHAR2(10) NOT NULL,
memo VARCHAR2(500),
CONSTRAINT account_txn_pk
PRIMARY KEY (account_id, txn_seq)
)
ORGANIZATION INDEX;
Primary Key Leaf의 논리 순서입니다.
(account_id=100, txn_seq=1)
(account_id=100, txn_seq=2)
(account_id=100, txn_seq=3)
(account_id=101, txn_seq=1)
...
다음 Query는 선두 Prefix와 연속 Range를 사용합니다.
SELECT txn_seq,
txn_time,
amount,
txn_type
FROM account_txn
WHERE account_id = :account_id
AND txn_seq >= :from_seq
AND txn_seq < :to_seq;
가능한 이점입니다.
- 관련 Row 자체가 Leaf Entry에 저장됨
- Primary Key 순서의 연속 Range
- 별도 Heap ROWID Access가 없음
- 정렬과 Top-N을 Primary Key 순서로 지원 가능
다음 Query는 선두 account_id가 없습니다.
WHERE txn_seq = :txn_seq
일반 복합 B-tree와 마찬가지로 좁은 Range Scan이 어렵거나 Skip Scan·Full Scan 후보가 될 수 있습니다.
IOT
≠ Primary Key 어느 Column이든 동일 효율
Leading Prefix
→ 여전히 중요
5. IOT 전체 Scan
Heap Table의 전체 Row Scan은 보통 다음 Operation입니다.
TABLE ACCESS FULL
IOT Row는 Primary Key Index 구조에 있으므로 다음과 같은 전체 Scan이 후보가 됩니다.
INDEX FULL SCAN SYS_IOT_TOP_...
INDEX FAST FULL SCAN SYS_IOT_TOP_...
Index Full Scan
- Primary Key 순서로 Leaf Entry를 읽음
- ORDER BY가 Primary Key 순서와 호환되면 Sort를 줄일 수 있음
Index Fast Full Scan
- Key 순서를 보장하지 않음
- Multiblock·병렬 처리 후보
- 필요한 Column이 IOT Top Leaf에 있으면 전체 Row 처리 후보
Overflow Column이 필요한 Query는 Top Leaf만으로 완성되지 않을 수 있습니다.
IOT Top Fast Full Scan
+ Overflow Access
전체 Scan이 많은 업무에서는 Heap Table Full Scan과 IOT Top·Overflow Scan의 실제 Block·Elapsed를 비교합니다.
6. Row 폭과 Leaf 밀도
일반 B-tree Leaf Entry는 주로 Key와 ROWID를 저장합니다. IOT Leaf Entry는 Primary Key와 Non-Key Row Data를 함께 저장하므로 더 넓을 수 있습니다.
넓은 IOT Row
→ Leaf Block당 Row 수 감소
→ Leaf Blocks 증가
→ BLEVEL 증가 가능
→ Range Scan Block 증가
→ Buffer Cache 점유 증가
→ Split·Redo·Undo 증가
확인합니다.
SELECT index_name,
blevel,
leaf_blocks,
distinct_keys,
avg_leaf_blocks_per_key,
pct_direct_access,
last_analyzed
FROM user_indexes
WHERE table_name = 'ACCOUNT_TXN';
Row 폭과 Leaf 밀도는 단건 조회뿐 아니라 Range·Full Scan·DML 전체에 영향을 줍니다.
7. Overflow Segment 구조
IOT Row가 넓으면 Row를 두 부분으로 나눌 수 있습니다.
IOT Top Index Entry
Primary Key Columns
+ Index 영역에 남은 Non-Key Columns
+ Overflow Row Piece의 Physical 위치 정보
Overflow Segment
나머지 Non-Key Columns
Oracle 공식 용어입니다.
Head Piece
→ Primary Key와 Threshold 안에 들어오는 Non-Key Column
→ IOT Index Leaf에 저장
Tail Piece
→ 나머지 Non-Key Column
→ Overflow Segment에 저장
7.1 PCTTHRESHOLD
PCTTHRESHOLD는 Overflow를 사용할 때 IOT Index Block에 저장할 Row 부분의 최대 크기를 Block Size 대비 백분율로 지정합니다.
PCTTHRESHOLD 20
→ Row Head Piece가 Index Block Size의 20% 이내에 들어가도록 시도
주요 공식 제한입니다.
- 값 범위: 1~50
- 기본값: 50
- 모든 Primary Key Column은 Threshold 안에 들어가야 함
- Row는 Column 경계에서 Head·Tail Piece로 분리됨
CREATE TABLE document_index (
token VARCHAR2(50) NOT NULL,
document_id NUMBER NOT NULL,
token_frequency NUMBER,
token_offsets VARCHAR2(2000),
CONSTRAINT document_index_pk
PRIMARY KEY (token, document_id)
)
ORGANIZATION INDEX
PCTTHRESHOLD 20
OVERFLOW;
7.2 INCLUDING
INCLUDING column_name은 Primary Key와 함께 IOT Top Leaf에 저장하려는 마지막 Non-Key Column을 지정합니다.
CREATE TABLE document_index2 (
token VARCHAR2(50) NOT NULL,
document_id NUMBER NOT NULL,
token_frequency NUMBER,
token_offsets VARCHAR2(2000),
CONSTRAINT document_index2_pk
PRIMARY KEY (token, document_id)
)
ORGANIZATION INDEX
PCTTHRESHOLD 20
INCLUDING token_frequency
OVERFLOW;
개념적 저장입니다.
Top Leaf
token
document_id
token_frequency
Overflow Pointer
Overflow
token_offsets
7.3 PCTTHRESHOLD와 INCLUDING 충돌
INCLUDING
→ 해당 Column까지 Top에 유지하려는 논리 경계
PCTTHRESHOLD
→ 실제 Block Size 기반 최대 Row Head 크기
둘이 충돌하면 PCTTHRESHOLD가 우선합니다.
INCLUDING Column까지 저장하면 Threshold 초과
→ Threshold 기준으로 더 앞 Column에서 Overflow 가능
7.4 Stored Column Order
Oracle은 IOT의 Primary Key Column을 저장 순서 앞쪽으로 이동시킵니다.
CREATE TABLE iot_example (
a NUMBER,
b NUMBER,
c NUMBER,
d NUMBER,
CONSTRAINT iot_example_pk PRIMARY KEY (c, b)
)
ORGANIZATION INDEX;
개념적 저장 순서입니다.
c, b, a, d
INCLUDING은 이 저장 순서를 기준으로 판단해야 합니다.
8. Overflow의 이점과 비용
이점
- Top Leaf Row 폭 감소
- Leaf Block당 Row 수 증가
- Primary Key 단건·Range Query의 Top Leaf I/O 감소
- 큰 드문 Column이 B-tree 전체를 비대하게 만드는 현상 완화
- Primary Key와 자주 읽는 작은 Column을 같은 Leaf에서 반환
비용
- Overflow Column 조회 시 추가 Segment Access
- Top Entry에서 Overflow 위치를 따라가는 추가 Block I/O
- Top·Overflow 두 Segment의 Space·Backup·Statistics 관리
- Update 시 Head·Tail Piece 유지 비용
- 모든 Query가 Overflow Column을 읽으면 IOT 이점 감소
Overflow
= 큰 Column 비용 제거
X
Overflow
= 큰 Column 비용을 필요한 Query에만 지연
O
9. Secondary Index와 Logical ROWID
IOT Row는 B-tree Leaf Split·Insert·재구성으로 물리 Block 위치가 바뀔 수 있습니다.
Heap Table Secondary Index
Secondary Key
+ Physical ROWID
IOT Secondary Index
Secondary Key
+ Primary Key 기반 Logical ROWID
+ 선택적 Physical Guess
9.1 Logical ROWID
Logical ROWID는 IOT Primary Key를 기반으로 Row를 식별합니다.
Logical ROWID
→ Primary Key Value
→ Control Information
→ Optional Physical Guess
Primary Key가 같다면 Row의 Leaf Block 위치가 바뀌어도 Logical ROWID는 유효합니다.
Logical ROWID의 길이는 Primary Key 길이에 영향을 받습니다.
긴 Primary Key
→ Secondary Index Entry 증가
→ Leaf Blocks·Cache·DML 비용 증가 가능
9.2 Physical Guess
Physical Guess는 Secondary Index를 만들거나 Rebuild할 때 Row가 있던 IOT Leaf Block 위치를 추정 정보로 저장합니다.
Secondary Index Scan
→ Physical Guess Block 직접 확인
Guess가 정확하면 Primary Key B-tree 전체 탐색을 생략할 수 있습니다.
9.3 정확한 Guess
Secondary Index Scan
→ Guess가 가리키는 IOT Leaf Block
→ Row 확인
Heap Secondary Index의 Physical ROWID Access와 유사한 비용을 기대할 수 있습니다.
9.4 오래된 Guess
IOT Row가 Split·Insert·Move로 다른 Leaf Block에 위치하면 Guess가 오래될 수 있습니다.
Secondary Index Scan
→ 오래된 Guess Block 확인
→ Row 없음
→ Logical ROWID의 Primary Key로 IOT 재탐색
Guess가 오래돼도 Index는 사용 가능합니다. 다만 잘못된 Block 접근과 Primary Key Unique Scan 비용이 추가될 수 있습니다.
10. PCT_DIRECT_ACCESS
USER_INDEXES.PCT_DIRECT_ACCESS는 IOT Secondary Index의 Physical Guess가 유효한 Row 비율을 나타냅니다.
SELECT index_name,
index_type,
blevel,
leaf_blocks,
pct_direct_access,
last_analyzed
FROM user_indexes
WHERE table_name = 'ACCOUNT_TXN'
ORDER BY index_name;
PCT_DIRECT_ACCESS = 100
→ 수집 시점에 Guess가 모두 유효한 방향
낮은 PCT_DIRECT_ACCESS
→ 많은 Entry에서 PK 재탐색 가능성
주의사항입니다.
- Statistics 수집이 필요
- 실제 특정 SQL의 Guess Hit Rate와 완전히 같다고 단정하지 않음
- Secondary Index 후보 Row 수와 Primary Key 재탐색 Buffers를 함께 봄
- Secondary Index Rebuild는 Guess를 새로 만들 수 있지만 IOT를 읽는 비용과 DML·가용성을 검증해야 함
PCT_DIRECT_ACCESS 낮음
≠ 즉시 Rebuild
Runtime 비용 증가 확인
+ 업무 중요도
+ Rebuild 비용
→ 판단
11. Bitmap Secondary Index와 Mapping Table
IOT에 Bitmap Secondary Index를 만들려면 Mapping Table이 필요합니다.
CREATE TABLE sales_iot (
sale_id NUMBER,
status_code VARCHAR2(10),
customer_id NUMBER,
amount NUMBER,
CONSTRAINT sales_iot_pk PRIMARY KEY (sale_id)
)
ORGANIZATION INDEX
MAPPING TABLE;
개념적 접근입니다.
Bitmap Index
→ Bit Position을 Physical ROWID로 변환
Physical ROWID
→ Heap-Organized Mapping Table Row
Mapping Table Row
→ IOT Logical ROWID
Logical ROWID
→ IOT Row Access
Mapping Table은 IOT Row마다 대응하는 Logical ROWID를 저장합니다.
Bitmap Index on IOT
= Bitmap Index
+ Mapping Table
+ Logical ROWID Access
이 구조는 추가 Segment·DML·Access 비용을 만들므로 DW형 읽기 중심 Workload에서 실측해야 합니다.
12. Primary Key 길이·변경·Insert 분포
12.1 긴 Primary Key
Primary Key는 Top Leaf Row와 Secondary Index Logical ROWID에 영향을 줍니다.
긴 PK
→ IOT Leaf Entry 증가
→ Secondary Index Entry 증가
→ Cache·Scan·DML 비용 증가
IOT Primary Key는 가능한 한 짧고 안정적인 업무 Key 또는 적절한 Surrogate Key인지 검토합니다.
12.2 Primary Key Update
Primary Key는 Row의 정렬 위치와 Logical ROWID 기반입니다.
PK 변경
→ 기존 Key 위치에서 삭제
→ 새 Key 위치에 삽입
→ Secondary Index Logical ROWID 유지 정보 변경
→ Split·Redo·Undo 가능
Primary Key 변경이 잦은 Table은 IOT에 불리할 수 있습니다.
12.3 Insert 분포
순차 증가 PK
→ 오른쪽 Leaf 집중
→ Hot Block·Split 가능
무작위 PK
→ 여러 Leaf에 분산 Insert
→ 기존 Block Split·Cache 변화 가능
IOT는 Row 전체가 Leaf에 있으므로 일반 PK Index보다 Split 시 이동하는 Data 양이 클 수 있습니다.
13. IOT가 유리한 Workload
- Primary Key 단건 조회 비중이 높음
- Primary Key 선두 Prefix Range가 핵심
- 관련 Row를 Primary Key 순서로 함께 읽음
- Row가 비교적 좁음
- Primary Key가 짧고 변경이 거의 없음
- Secondary Index 수·사용 비중이 낮음
- Overflow Column은 드물게 조회
- Heap Table의 PK Index→Table Random Access 비용이 큼
대표 사례입니다.
계좌별 현재 잔액
계좌별 순번 거래
문서 Token·Document Key
Configuration·Lookup
Primary Key 중심 Key-Value
다대다 관계의 정렬된 교차 Table
14. IOT가 불리한 Workload
- 대부분 Query가 Secondary Index 중심
- Row가 매우 넓고 많은 Column을 매번 조회
- Overflow Column을 거의 모든 Query가 읽음
- Primary Key가 길거나 변경이 잦음
- 무작위 Insert와 Leaf Split이 매우 많음
- Secondary Index가 많아 Logical ROWID 중복 저장이 큼
- 대량 Full Scan이 핵심이고 Heap 구조가 더 단순
- DML 처리량이 매우 중요
- Bitmap Index·Mapping Table 구조가 과도하게 복잡
IOT 선택
= PK 조회가 있음
X
IOT 선택
= PK 중심 Access 이득
> Leaf·Overflow·Secondary·DML 총비용
15. 실행계획과 Runtime 검증
15.1 Primary Key Query
SELECT /*+ GATHER_PLAN_STATISTICS */
balance,
updated_at
FROM account_balance
WHERE account_id = :account_id;
SELECT *
FROM TABLE(
DBMS_XPLAN.DISPLAY_CURSOR(
:sql_id,
:child_no,
'ALLSTATS LAST +PREDICATE +ALIAS +NOTE'
)
);
확인합니다.
- IOT Top Object의 Unique·Range Scan
- 별도 Heap
TABLE ACCESS BY INDEX ROWID가 없는지 - Starts·A-Rows·Buffers·Reads
- 동일 Heap Table 설계와 비교
15.2 Prefix Range Query
Index Leaf A-Rows
Index Buffers·Reads
Sort 제거 여부
Top-N Stopkey
Overflow Access 여부
15.3 Secondary Index Query
CREATE INDEX account_txn_time_ix
ON account_txn(txn_time);
확인합니다.
- Secondary Index A-Rows·Buffers
- IOT Row Access Buffers
- Physical Guess와 PK 재탐색 비용
PCT_DIRECT_ACCESS- Primary Key 길이에 따른 Secondary Segment 크기
- Heap Table Secondary Index 경로와 비교
15.4 Overflow Query
Top Leaf만 필요한 Query
vs
Overflow Column까지 필요한 Query
비교합니다.
- Top Index Buffers
- Overflow Segment Buffers·Reads
- 후보 Row 수
- Row 폭
- 동일 결과의 Heap Table 경로
15.5 DML
- INSERT·UPDATE·DELETE TPS
- Primary Key Update
- Leaf Split·Segment 증가
- Redo·Undo
- Secondary Index 유지
- Mapping Table 유지
- Lock·Concurrency
- Data 증가 후 BLEVEL·LEAF_BLOCKS
16. Heap Table과 IOT 비교
| 항목 | Heap Table + PK Index | IOT |
|---|---|---|
| Row 저장 | Heap Table Block | Primary Key B-tree Leaf |
| PK 필수 | 선택적 | 필수 |
| PK 조회 | PK Index → Physical ROWID → Heap | IOT Leaf에서 Row |
| Row 식별 | Physical ROWID | Primary Key 기반 Logical ROWID |
| PK Prefix Range | Index 후 Heap Access | PK 순서로 Row 자체가 저장 |
| 전체 Scan | TABLE ACCESS FULL | INDEX FULL·FAST FULL SCAN |
| 넓은 Row | Heap에 저장 | Top Leaf 비대화 또는 Overflow |
| Secondary Index | Physical ROWID | Logical ROWID + Physical Guess |
| Bitmap Index | Table Row Physical ROWID | Mapping Table 필요 |
| 주요 이점 | 범용 Access·일반 운영 | PK 중심 Access·Heap Random Access 감소 |
| 주요 위험 | PK Random Table Access | Leaf 폭·Overflow·Guess·Secondary·Split 비용 |
17. 적용 판단 절차
1. Query 비중을 PK·Prefix·Secondary·Full Scan으로 분류한다.
2. Primary Key 길이·변경 빈도·Insert 분포를 확인한다.
3. Row 폭과 자주 읽는 Column을 구분한다.
4. Top Leaf와 Overflow 경계를 PCTTHRESHOLD·INCLUDING으로 설계한다.
5. Secondary Index 수와 Logical ROWID Segment 비용을 계산한다.
6. Bitmap Index가 필요하면 Mapping Table 비용을 포함한다.
7. Heap PK Index→Table Access와 IOT Top Access를 실측한다.
8. Overflow·Secondary Query의 Buffers·Reads·PCT_DIRECT_ACCESS를 측정한다.
9. DML·Redo·Undo·Split·Space·Backup을 비교한다.
10. Data 증가 후 동일 Workload로 재검증하고 Rollback 계획을 준비한다.
자주 혼동하는 판단
| 혼동 | 정확한 기준 |
|---|---|
| IOT는 Heap Table에 Index 하나를 추가한 구조다 | Table Row 자체가 Primary Key B-tree Leaf에 저장된다 |
| IOT는 모든 Query를 빠르게 한다 | PK·Prefix Query에 강하고 Secondary·Full Scan은 별도 검증한다 |
| IOT에는 별도 Segment가 없다 | Overflow·Secondary Index·Mapping Table Segment가 존재할 수 있다 |
| INCLUDING이 항상 우선한다 | PCTTHRESHOLD와 충돌하면 Threshold가 우선한다 |
| Overflow를 사용하면 큰 Column 비용이 사라진다 | 큰 Column Query에서 Overflow Segment Access가 발생한다 |
| Secondary Index는 Physical ROWID만 저장한다 | PK 기반 Logical ROWID와 Physical Guess를 사용한다 |
| Guess가 오래되면 Secondary Index를 사용할 수 없다 | Logical ROWID의 PK로 재탐색하지만 비용이 추가될 수 있다 |
| PCT_DIRECT_ACCESS가 낮으면 무조건 Rebuild한다 | 실제 PK 재탐색 비용과 Rebuild 운영비를 측정한다 |
| Bitmap Index를 IOT에 바로 만들 수 있다 | Mapping Table이 필요하다 |
| 긴 PK는 Top Index에만 영향이 있다 | Secondary Logical ROWID 크기에도 영향을 준다 |
개념 확인 문제
문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.
01Heap Table+Primary Key Index와 IOT의 Row 저장 구조 차이를 설명하시오.
Heap과 IOT
- Heap Table은 Row를 Heap Block에 저장하고 PK Index에는 Key와 Physical ROWID를 저장합니다.
- IOT는 Primary Key B-tree Leaf에 Primary Key와 Non-Key Row Data를 함께 저장합니다.
02IOT에서 Primary Key Constraint가 반드시 필요한 이유를 설명하시오.
Primary Key 필수 이유
- Row의 논리적 식별자입니다.
- IOT B-tree의 정렬·탐색 Key입니다.
- Secondary Index Logical ROWID의 기반입니다.
03IOT Primary Key 단건·Prefix Range가 Heap Table Access를 줄이는 원리를 설명하시오.
PK Access 이점
- Heap은 PK Index에서 ROWID를 얻은 뒤 Heap Block을 읽습니다.
- IOT는 PK Leaf Entry에서 Row Data를 직접 반환합니다.
- 복합 PK 선두 Prefix Range에서는 관련 Row 자체가 Key 순서로 인접 저장됩니다.
04IOT 전체 Scan이 Index Full·Fast Full Scan 형태가 되는 이유를 설명하시오.
전체 Scan
- IOT Row는 Primary Key Index 구조에 있으므로 Table Full Scan 대신 IOT Top Index의 Full Scan 또는 Fast Full Scan으로 전체 Row를 읽습니다.
- Overflow Column이 필요하면 추가 Overflow Access가 발생할 수 있습니다.
05PCTTHRESHOLD, INCLUDING, OVERFLOW의 역할과 우선순위를 설명하시오.
Threshold·Including·Overflow
- PCTTHRESHOLD는 Index Block에 저장할 Head Piece 최대 크기를 Block Size 백분율로 지정합니다.
- INCLUDING은 Top Leaf에 유지하려는 마지막 Non-Key Column을 지정합니다.
- OVERFLOW는 나머지 Tail Piece용 Segment를 만듭니다.
- INCLUDING과 Threshold가 충돌하면 PCTTHRESHOLD가 우선합니다.
06Overflow Head Piece·Tail Piece의 저장 위치와 조회 비용을 설명하시오.
Head·Tail
- Head Piece는 Primary Key와 Threshold 안에 들어오는 Non-Key Column을 IOT Top Leaf에 저장합니다.
- Tail Piece는 나머지 Non-Key Column을 Overflow Segment에 저장합니다.
- Overflow Column Query는 Top Entry와 Overflow Segment를 모두 읽을 수 있습니다.
07Secondary Index Logical ROWID와 Physical Guess의 역할을 설명하시오.
Logical ROWID·Guess
- Logical ROWID는 Primary Key를 기반으로 IOT Row를 식별합니다.
- Physical Guess는 Row가 있을 가능성이 높은 IOT Leaf Block 위치를 저장해 PK 전체 재탐색을 줄이려는 정보입니다.
08정확한 Guess와 오래된 Guess의 접근 경로 차이를 설명하시오.
Guess 정확도
- 정확하면 Secondary Index Scan 후 Guess Block에서 Row를 직접 확인합니다.
- 오래됐으면 잘못된 Block 확인 후 Logical ROWID의 Primary Key로 IOT를 다시 탐색합니다.
- Guess가 오래돼도 Index는 사용 가능합니다.
09PCTDIRECTACCESS와 Mapping Table을 각각 어떤 판단에 사용하는지 설명하시오.
PCT_DIRECT_ACCESS·Mapping
- PCT_DIRECT_ACCESS는 Secondary Index Physical Guess가 유효한 Row 비율을 평가하는 Statistics입니다.
- Mapping Table은 Bitmap Index의 Physical Row Position과 IOT Logical ROWID를 연결합니다.
10Heap Table과 IOT를 선택할 때 PK·Row 폭·Secondary·DML·Segment 비용을 검증하는 절차를 설명하시오.
선택 절차 - PK·Prefix·Secondary·Full Scan Query 비중을 분류합니다. - PK 길이·변경·Insert 분포와 Row 폭을 확인합니다. - Overflow 경계와 Secondary·Bitmap Mapping 비용을 설계합니다. - Heap·IOT의 Buffers·Reads·Elapsed와 DML·Redo·Space를 동일 Workload로 비교합니다. - Data 증가 후 Split·PCT_DIRECT_ACCESS·Segment 크기를 재검증합니다.