<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81_%ED%8C%A9%ED%84%B0</id>
	<title>인덱스 클러스터링 팩터 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81_%ED%8C%A9%ED%84%B0"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81_%ED%8C%A9%ED%84%B0&amp;action=history"/>
	<updated>2026-05-08T18:48:39Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81_%ED%8C%A9%ED%84%B0&amp;diff=1553&amp;oldid=prev</id>
		<title>Oracle: 새 문서: 좋은 질문입니다! 명확하게 정리해드리겠습니다.  ## 정답: **인덱스의 Clustering Factor**입니다!   Clustering Factor는 **인덱스의 속성**이지, 테이블의 속성이 아닙니다.  ---  ## 개념 정리  ### 📊 Clustering Factor는 인덱스별로 존재  ```sql -- Clustering Factor는 DBA_INDEXES 뷰에 있음 (테이블 뷰가 아님!) SELECT      index_name,           -- 인덱스 이름     table_name,           -- 참조하는 테이블...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%9D%B8%EB%8D%B1%EC%8A%A4_%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81_%ED%8C%A9%ED%84%B0&amp;diff=1553&amp;oldid=prev"/>
		<updated>2025-10-02T06:53:52Z</updated>

		<summary type="html">&lt;p&gt;새 문서: 좋은 질문입니다! 명확하게 정리해드리겠습니다.  ## 정답: **인덱스의 Clustering Factor**입니다!   Clustering Factor는 **인덱스의 속성**이지, 테이블의 속성이 아닙니다.  ---  ## 개념 정리  ### 📊 Clustering Factor는 인덱스별로 존재  ```sql -- Clustering Factor는 DBA_INDEXES 뷰에 있음 (테이블 뷰가 아님!) SELECT      index_name,           -- 인덱스 이름     table_name,           -- 참조하는 테이블...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;좋은 질문입니다! 명확하게 정리해드리겠습니다.&lt;br /&gt;
&lt;br /&gt;
## 정답: **인덱스의 Clustering Factor**입니다! &lt;br /&gt;
&lt;br /&gt;
Clustering Factor는 **인덱스의 속성**이지, 테이블의 속성이 아닙니다.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 개념 정리&lt;br /&gt;
&lt;br /&gt;
### 📊 Clustering Factor는 인덱스별로 존재&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- Clustering Factor는 DBA_INDEXES 뷰에 있음 (테이블 뷰가 아님!)&lt;br /&gt;
SELECT &lt;br /&gt;
    index_name,           -- 인덱스 이름&lt;br /&gt;
    table_name,           -- 참조하는 테이블&lt;br /&gt;
    clustering_factor     -- 이 인덱스의 CF&lt;br /&gt;
FROM dba_indexes&lt;br /&gt;
WHERE table_name = &amp;#039;EMPLOYEES&amp;#039;;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**결과 예시:**&lt;br /&gt;
```&lt;br /&gt;
INDEX_NAME          TABLE_NAME    CLUSTERING_FACTOR&lt;br /&gt;
------------------  ------------  -----------------&lt;br /&gt;
EMP_DEPT_IDX        EMPLOYEES     1,500      &amp;lt;- 이 인덱스의 CF&lt;br /&gt;
EMP_NAME_IDX        EMPLOYEES     89,000     &amp;lt;- 다른 값!&lt;br /&gt;
EMP_SALARY_IDX      EMPLOYEES     45,000     &amp;lt;- 또 다른 값!&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 같은 테이블, 다른 인덱스 = 다른 CF&lt;br /&gt;
&lt;br /&gt;
### 실제 예제로 이해하기&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- 테이블 생성&lt;br /&gt;
CREATE TABLE employees (&lt;br /&gt;
    emp_id      NUMBER,&lt;br /&gt;
    dept_id     NUMBER,&lt;br /&gt;
    hire_date   DATE,&lt;br /&gt;
    salary      NUMBER&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- 데이터 삽입 (dept_id 순서로 정렬되어 입력됨)&lt;br /&gt;
INSERT INTO employees &lt;br /&gt;
SELECT LEVEL, MOD(LEVEL, 10) + 1, SYSDATE - LEVEL, LEVEL * 1000&lt;br /&gt;
FROM dual CONNECT BY LEVEL &amp;lt;= 100000;&lt;br /&gt;
&lt;br /&gt;
-- 통계 수집&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, &amp;#039;EMPLOYEES&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
-- 여러 인덱스 생성&lt;br /&gt;
CREATE INDEX emp_dept_idx ON employees(dept_id);&lt;br /&gt;
CREATE INDEX emp_hire_idx ON employees(hire_date);&lt;br /&gt;
CREATE INDEX emp_salary_idx ON employees(salary);&lt;br /&gt;
&lt;br /&gt;
-- 각 인덱스의 CF 확인&lt;br /&gt;
SELECT &lt;br /&gt;
    index_name,&lt;br /&gt;
    clustering_factor,&lt;br /&gt;
    num_rows,&lt;br /&gt;
    (SELECT blocks FROM user_tables WHERE table_name = &amp;#039;EMPLOYEES&amp;#039;) AS table_blocks&lt;br /&gt;
FROM user_indexes&lt;br /&gt;
WHERE table_name = &amp;#039;EMPLOYEES&amp;#039;;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**결과:**&lt;br /&gt;
```&lt;br /&gt;
INDEX_NAME      CLUSTERING_FACTOR   NUM_ROWS   TABLE_BLOCKS&lt;br /&gt;
--------------  -----------------   --------   ------------&lt;br /&gt;
EMP_DEPT_IDX    1,200              100,000    1,200    &amp;lt;- 좋음! ✅&lt;br /&gt;
EMP_HIRE_IDX    95,000             100,000    1,200    &amp;lt;- 나쁨! ❌&lt;br /&gt;
EMP_SALARY_IDX  98,000             100,000    1,200    &amp;lt;- 나쁨! ❌&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### 왜 이런 차이가 발생할까?&lt;br /&gt;
&lt;br /&gt;
**EMP_DEPT_IDX (CF = 1,200) - 좋음**&lt;br /&gt;
```&lt;br /&gt;
테이블 물리적 저장 순서: dept_id 순으로 입력됨&lt;br /&gt;
&lt;br /&gt;
Block 1: [dept_id=1, 1, 1, 1, 1...]&lt;br /&gt;
Block 2: [dept_id=2, 2, 2, 2, 2...]&lt;br /&gt;
Block 3: [dept_id=3, 3, 3, 3, 3...]&lt;br /&gt;
&lt;br /&gt;
인덱스 스캔: dept_id=1 → 같은 블록 내에서 여러 행 읽기 가능&lt;br /&gt;
→ Clustering Factor ≈ 블록 수 (1,200)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**EMP_HIRE_IDX (CF = 95,000) - 나쁨**&lt;br /&gt;
```&lt;br /&gt;
인덱스는 hire_date 순서로 정렬되어 있지만&lt;br /&gt;
테이블은 dept_id 순서로 저장됨&lt;br /&gt;
&lt;br /&gt;
인덱스 스캔: hire_date 순으로 읽으면 &lt;br /&gt;
→ 각 행이 서로 다른 블록에 흩어져 있음&lt;br /&gt;
→ Clustering Factor ≈ 행 수 (95,000)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 상세 비교&lt;br /&gt;
&lt;br /&gt;
### DBA_INDEXES vs DBA_TABLES&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- ✅ 있음: 인덱스에는 CLUSTERING_FACTOR 컬럼 존재&lt;br /&gt;
DESC dba_indexes;&lt;br /&gt;
-- CLUSTERING_FACTOR    NUMBER&lt;br /&gt;
&lt;br /&gt;
-- ❌ 없음: 테이블에는 CLUSTERING_FACTOR 컬럼 없음&lt;br /&gt;
DESC dba_tables;&lt;br /&gt;
-- CLUSTERING_FACTOR 컬럼 없음!&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 왜 &amp;quot;인덱스의&amp;quot; 속성인가?&lt;br /&gt;
&lt;br /&gt;
### Clustering Factor의 정의&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **&amp;quot;이 특정 인덱스의 키 순서&amp;quot;와 &amp;quot;테이블 블록의 물리적 배치&amp;quot;가 얼마나 일치하는가**&lt;br /&gt;
&lt;br /&gt;
즉, CF는:&lt;br /&gt;
- ✅ 인덱스 키 순서와 관련됨&lt;br /&gt;
- ✅ 인덱스마다 다름&lt;br /&gt;
- ✅ 인덱스 통계의 일부&lt;br /&gt;
- ❌ 테이블 자체의 속성이 아님&lt;br /&gt;
&lt;br /&gt;
### 계산 과정 (의사 코드)&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
clustering_factor = 0&lt;br /&gt;
previous_block = None&lt;br /&gt;
&lt;br /&gt;
# 이 인덱스를 순서대로 스캔&lt;br /&gt;
for row in index.scan_in_key_order():&lt;br /&gt;
    current_block = row.get_table_block()&lt;br /&gt;
    &lt;br /&gt;
    if current_block != previous_block:&lt;br /&gt;
        clustering_factor += 1&lt;br /&gt;
    &lt;br /&gt;
    previous_block = current_block&lt;br /&gt;
&lt;br /&gt;
# CF는 &amp;quot;인덱스 순서대로 읽을 때&amp;quot; 몇 개의 블록을 접근하는가&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 실무 예제: 인덱스별 CF 비교&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- 같은 테이블의 모든 인덱스 CF 비교&lt;br /&gt;
WITH table_info AS (&lt;br /&gt;
    SELECT &lt;br /&gt;
        &amp;#039;EMPLOYEES&amp;#039; AS table_name,&lt;br /&gt;
        blocks AS table_blocks,&lt;br /&gt;
        num_rows&lt;br /&gt;
    FROM user_tables &lt;br /&gt;
    WHERE table_name = &amp;#039;EMPLOYEES&amp;#039;&lt;br /&gt;
)&lt;br /&gt;
SELECT &lt;br /&gt;
    i.index_name,&lt;br /&gt;
    i.clustering_factor,&lt;br /&gt;
    t.table_blocks,&lt;br /&gt;
    t.num_rows,&lt;br /&gt;
    -- CF 품질 평가&lt;br /&gt;
    ROUND(i.clustering_factor / t.table_blocks, 2) AS cf_block_ratio,&lt;br /&gt;
    CASE &lt;br /&gt;
        WHEN i.clustering_factor &amp;lt;= t.table_blocks * 1.5 THEN &amp;#039;매우 좋음 ⭐⭐⭐&amp;#039;&lt;br /&gt;
        WHEN i.clustering_factor &amp;lt;= t.table_blocks * 5 THEN &amp;#039;좋음 ⭐⭐&amp;#039;&lt;br /&gt;
        WHEN i.clustering_factor &amp;lt;= t.num_rows * 0.3 THEN &amp;#039;보통 ⭐&amp;#039;&lt;br /&gt;
        ELSE &amp;#039;나쁨 ❌&amp;#039;&lt;br /&gt;
    END AS cf_quality,&lt;br /&gt;
    -- 이 인덱스로 100행 읽을 때 예상 블록 수&lt;br /&gt;
    ROUND((i.clustering_factor / t.num_rows) * 100, 0) AS blocks_per_100_rows&lt;br /&gt;
FROM user_indexes i&lt;br /&gt;
CROSS JOIN table_info t&lt;br /&gt;
WHERE i.table_name = t.table_name&lt;br /&gt;
ORDER BY i.clustering_factor;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**결과 예시:**&lt;br /&gt;
```&lt;br /&gt;
INDEX_NAME       CF      BLOCKS  QUALITY         BLOCKS_PER_100_ROWS&lt;br /&gt;
--------------   ------  ------  --------------  -------------------&lt;br /&gt;
EMP_DEPT_IDX     1,200   1,200   매우 좋음 ⭐⭐⭐   1&lt;br /&gt;
EMP_JOB_IDX      5,000   1,200   좋음 ⭐⭐         5&lt;br /&gt;
EMP_SALARY_IDX   45,000  1,200   보통 ⭐          45&lt;br /&gt;
EMP_NAME_IDX     89,000  1,200   나쁨 ❌          89&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 혼동하기 쉬운 개념 정리&lt;br /&gt;
&lt;br /&gt;
| 개념 | 설명 | 위치 |&lt;br /&gt;
|-----|------|------|&lt;br /&gt;
| **Clustering Factor** | 인덱스 키 순서와 테이블 블록 배치의 일치도 | DBA_INDEXES |&lt;br /&gt;
| **Table Blocks** | 테이블이 차지하는 물리적 블록 수 | DBA_TABLES |&lt;br /&gt;
| **Index Clustering** | IOT(Index-Organized Table) | 테이블 구조 |&lt;br /&gt;
| **Hash Cluster** | 여러 테이블을 클러스터 키로 묶음 | DBA_CLUSTERS |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 핵심 정리&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- ✅ 맞는 표현&lt;br /&gt;
&amp;quot;EMP_DEPT_IDX 인덱스의 Clustering Factor가 높다&amp;quot;&lt;br /&gt;
&amp;quot;이 인덱스는 CF가 나쁘다&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ❌ 틀린 표현&lt;br /&gt;
&amp;quot;EMPLOYEES 테이블의 Clustering Factor가 높다&amp;quot;&lt;br /&gt;
&amp;quot;테이블 CF가 나쁘다&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### 올바른 이해&lt;br /&gt;
&lt;br /&gt;
1. **테이블**: 그냥 블록에 저장되어 있을 뿐&lt;br /&gt;
2. **인덱스**: 각각 자신의 키 순서대로 테이블을 가리킴&lt;br /&gt;
3. **CF**: 각 인덱스가 테이블을 얼마나 효율적으로 가리키는지 측정&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## 실전 시나리오&lt;br /&gt;
&lt;br /&gt;
### Q: 테이블을 재구성하면 모든 인덱스의 CF가 좋아지나요?&lt;br /&gt;
&lt;br /&gt;
**A: 아니요! 특정 인덱스 순서로 정렬해야 합니다.**&lt;br /&gt;
&lt;br /&gt;
```sql&lt;br /&gt;
-- 방법 1: DEPT_ID 인덱스의 CF 개선&lt;br /&gt;
CREATE TABLE emp_new AS&lt;br /&gt;
SELECT * FROM employees&lt;br /&gt;
ORDER BY dept_id;  -- 이 인덱스의 키 순서대로!&lt;br /&gt;
&lt;br /&gt;
-- 결과:&lt;br /&gt;
-- EMP_DEPT_IDX의 CF: 개선됨 ✅&lt;br /&gt;
-- 다른 인덱스들의 CF: 더 나빠질 수 있음 ❌&lt;br /&gt;
&lt;br /&gt;
-- 방법 2: 파티셔닝으로 여러 인덱스 동시 개선&lt;br /&gt;
ALTER TABLE employees MODIFY&lt;br /&gt;
PARTITION BY RANGE (dept_id)&lt;br /&gt;
...&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
**결론:** Clustering Factor는 **&amp;quot;이 인덱스로 테이블을 읽을 때의 효율성&amp;quot;**을 나타내는 **인덱스의 통계 정보**입니다. 같은 테이블이라도 인덱스마다 다른 CF 값을 가지며, DBA는 중요한 인덱스의 CF를 모니터링하고 개선해야 합니다!&lt;/div&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
</feed>