테이블의 데이터를 좀 더 빠르게 검색하기 위해 사용하는 데이터베이스 객체
Oracle Server가 Optimization method에 따라 어떤 인덱스를 사용할지, 인덱스를 사용하지 않을 지 결정한다
인덱스를 유지하려면 그만큼 저장공간이 필요하고 테이블 수정 시에 인덱스도 변경되어야 하므로 필요한 경우에만 인덱스를 생성하여 사용하는 것이 좋다
WHERE 절이나 조인 조건에서 컬럼을 자주 이용할 때UPDATE, INSERT, DELETE)Oracle 에서는 기본적으로 B*Tree 구조로 인덱스를 생성한다
B Tree : B(Balanced)는 트리 높이가 균형 잡혀있다는 뜻으로 높이 차가 최대 1인 트리를 말한다. 때문에 B Tree 는 어떤 값에 대해서도 같은 시간에 결과를 얻을 수 있다(O(logN)). 또한, B Tree는 BST와 달리 여러 자식 노드를 가질 수 있다
| 항목 | B-Tree | B+Tree | B*Tree |
|---|---|---|---|
| 데이터 저장 위치 | 내부 노드와 리프 노드 모두에 저장 | 🔸 데이터는 리프 노드에만 저장 | 🔸 B+Tree 기반, 데이터는 리프 노드에만 저장 |
| 검색 종료 위치 | 중간 노드에서도 검색 종료 가능 | 🔸 항상 리프 노드까지 내려감 | 🔸 B+Tree와 동일, 리프 노드에서만 검색 종료 |
| 리프 노드 연결 | ❌ 없음 | ✅ 좌우 리프 노드 연결 | ✅ 연결 + 밀도 높은 구조(범위 탐색 최적화) |
| 노드 분할 조건 | 50% 이상 찼을 때 분할 | 50% 이상 찼을 때 분할 | 🔸 형제 노드와 공간 공유 후 70% 이상일 때 분할 시도 |
| 탐색 성능 | 빠름 (단일 값 검색) | ✅ 범위 + 단일 모두 효율적 | ✅ 가장 효율적, 디스크 I/O 감소 |
| 사용 예시 | 이론 설명, 알고리즘 교재 등 | 일부 DBMS, 파일 시스템 | ✅ 대부분의 DBMS (Oracle, MySQL 등) |
WHERE UPPER(name) = 'JOHN'
예시와 같이 함수를 사용해서 컬럼값을 변형한 경우 인덱스를 사용하지 않는다
WHERE title <> '사원'
WHERE phone IS NULL
LIKE '%패턴' 인 경우WHERE name LIKE '%son'
WHERE emp_id = '100'
emp_id 가 NUMBER 타입일 때 암묵적 형변환으로 비교는 가능하지만, 인덱스를 사용하지 않는다
OR 는 거의 인덱스 사용을 하지 않는다고 보면 된다
IN 은 보통 인덱스 사용이 가능하지만 특정 경우에는 사용하지 않는다
WHERE dept_id IN (10, 20, 30, ...);
예시와 같이 리스트에 데이터가 너무 많거나 서브쿼리로 작성했을 경우, 쿼리 결과가 매우 많을 경우 인덱스를 사용하지 않는다
인덱스 컬럼이 emp_id, name, dept_id 라고 할 때
WHERE dept_id IN (10, 20, 30);
예시 에서 후행 컬럼인 dept_id 에 IN을 사용했으므로 인덱스 적용이 되지 않는다. 앞에 emp_id 와 name 에 대한 조건이 있으면 인덱스 사용이 가능하다
위에서 기술한 조건들이 IN의 리스트 안에도 적용될 경우 인덱스를 사용하지 않는다