Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

ki-sd 님의 블로그

[2026-04-21] 오라클 성능 최적화의 핵심, 인덱스(Index)와 DDL/객체 총정리 본문

OracleStudy

[2026-04-21] 오라클 성능 최적화의 핵심, 인덱스(Index)와 DDL/객체 총정리

ki-sd 2026. 4. 21. 17:02

수천만 건의 대용량 데이터 환경에서 쿼리의 검색 속도를 비약적으로 끌어올리는 인덱스의 원리와 실전 활용법을 마스터했다. 아울러 그동안 다루었던 모든 DB 객체(Table, View, Sequence, Index)와 SQL 문법을 총망라하여 정리했다.

 

1. 인덱스(Index)의 논리적 구조와 필요성

  • 개념: 두꺼운 책에서 원하는 내용을 빠르게 찾기 위해 맨 뒤에 있는 '색인(Index)'을 활용하듯, 데이터베이스에서도 특정 컬럼의 데이터를 미리 정렬하여 별도의 메모리 공간(TableSpace)에 보관해 두는 검색 최적화 기술이다.
  • 풀 테이블 스캔(Full Table Scan)의 한계: 인덱스가 없는 테이블에서 특정 조건(WHERE)을 검색하면, 오라클 엔진은 테이블의 첫 번째 행부터 마지막 행까지 무식하게 다 뒤져보는 풀 스캔을 수행한다. 데이터가 1,000만 건(t_ord_big 실습)이라면 엄청난 디스크 I/O와 성능 저하가 발생함을 확인했다.
  • 자동 생성 원리: CREATE TABLE 시 PRIMARY KEY나 UNIQUE 제약조건을 부여하면, 오라클이 내부적으로 해당 컬럼에 대해 고유 인덱스(Unique Index)를 자동으로 생성해 준다는 시스템의 기본 메커니즘을 상기했다.

2. 다양한 인덱스의 종류와 실전 전략

  • 단일 인덱스(Single Index): CREATE INDEX idx_name ON table(column); 처럼 하나의 컬럼만으로 생성한다. 단순히 이름이나 가격 등으로 필터링할 때 사용한다.
  • 복합 인덱스(Composite Index): CREATE INDEX idx_name ON table(type, price ASC); 처럼 여러 컬럼을 묶어서 생성한다. 실무에서는 조건이 하나만 들어오는 경우가 거의 없으므로 매우 자주 쓰인다.
    • 주의점: 복합 인덱스는 선언한 컬럼의 '순서'가 매우 중요하다. 인덱스가 (A, B) 순서로 만들어졌다면, 쿼리의 WHERE 절에서도 A가 먼저 조건으로 걸려야 인덱스를 제대로 타게 된다는 핵심 튜닝 지식을 습득했다.
  • 함수 기반 인덱스(Function-Based Index): WHERE SUBSTR(address, 1, 2) = '서울' 처럼 컬럼을 함수로 가공해서 검색하면 일반 인덱스는 작동하지 않는다. 이럴 때는 애초에 인덱스를 만들 때 CREATE INDEX idx_name ON table(SUBSTR(address, 1, 2)); 와 같이 함수로 가공된 결과 자체를 인덱싱해야 검색 속도를 보장받을 수 있음을 실습을 통해 뼈저리게 느꼈다.

3. 힌트(Hint)를 통한 실행 계획 강제 제어

  • 옵티마이저(Optimizer, 오라클의 쿼리 최적화 엔진)가 항상 최적의 길(인덱스)을 찾아가는 것은 아니다.
  • 개발자가 쿼리에 /*+ INDEX(table_name index_name) */ 또는 /*+ INDEX_DESC(...) */와 같은 힌트 주석을 삽입하여, "무조건 이 인덱스를 사용해서 읽어라"라고 강제하는 기술을 익혔다. 특히 INDEX_DESC를 활용하면 ORDER BY 연산을 생략하고도 최신순(내림차순)으로 데이터를 가져올 수 있어 성능을 크게 높일 수 있었다.

4. SQL 문법과 오라클 핵심 객체 총정리 오라클 과정을 마무리하며, 자바와 연동하기 전에 머릿속에 흩어져 있던 개념들을 다시 구조화했다.

  • DML (조작어): SELECT, INSERT, UPDATE, DELETE (데이터 그 자체를 다룸)
  • DDL (정의어): CREATE, ALTER, DROP, RENAME, TRUNCATE (저장소와 객체의 구조를 다룸)
  • DCL / TCL: 권한 통제(GRANT, REVOKE)와 트랜잭션 관리(COMMIT, ROLLBACK)
  • 핵심 객체 4대장:
    1. Table: 데이터가 실제로 저장되는 물리적 공간.
    2. View: 복잡한 SELECT 문을 단순화하고 보안을 유지하기 위해 사용하는 가상의 테이블.
    3. Sequence: 게시판 번호 등 PK 값을 위한 순차적 번호 자동 생성기.
    4. Index: 조회(SELECT) 성능을 극대화하기 위해 미리 정렬해 두는 검색 목차. (단, 무분별한 생성은 INSERT, UPDATE, DELETE 시마다 목차를 다시 써야 하므로 오히려 성능을 저하시킨다는 트레이드오프(Trade-off)를 명심해야 한다.)