본문 바로가기
정보관리(데이터베이스, DB)/DB

tibero에서 데이터를 많이 저장할 수록 왜 인덱스가 증가할까? 조회한 인덱스를 계속 저장하나?

by 3604 2025. 9. 25.
728x90


 
 

"데이터가 많아질수록 왜 인덱스가 계속 증가할까? 조회한 인덱스를 계속 저장하나?"
 아니요, 조회한 인덱스를 저장하지 않습니다.
인덱스가 증가하는 이유는 INSERT할 때마다 새로운 인덱스 엔트리가 생성되기 때문입니다.

✅ 핵심 원리: 인덱스는 INSERT 시점에 생성됨

  • 인덱스는 조회(SELECT)할 때 만들어지는 게 아니라,
    INSERT할 때 해당 컬럼 값을 기준으로 B+-Tree에 엔트리가 추가됩니다.

🔍 예시로 이해하기

Table
작업인덱스에 저장되는가?
INSERT INTO emp (id, name) VALUES (1, 'Alice') ✅ ID 컬럼 인덱스에 (1, ROWID) 저장
SELECT * FROM emp WHERE id = 1 ❌ 인덱스에 저장 안 함 (이미 있음)
UPDATE emp SET id = 2 WHERE id = 1 ✅ 기존 엔트리 삭제 + 새 엔트리 삽입
DELETE FROM emp WHERE id = 1 ✅ 인덱스에서 해당 엔트리 삭제

🧠 그래서 왜 인덱스가 커질까?

  • 테이블에 데이터가 늘어날수록,
    그에 대응하는 인덱스 엔트리도 1:1로 증가합니다.
  • 인덱스는 조회용 캐시가 아니라, 정렬된 검색용 구조체입니다.
  • 조회할 때마다 저장되는 게 아니라,
    데이터가 생길 때마다 인덱스에도 같은 수만큼 엔트리가 추가됩니다.

✅ 요약 한 줄

인덱스는 조회할 때 저장되는 게 아니라, INSERT할 때마다 그 값을 기준으로 B+-Tree에 엔트리가 추가되기 때문에 데이터가 늘어날수록 인덱스도 함께 커집니다.
 
 
 
INSERT할 때마다 새로운 인덱스 엔트리가 생성된다고 하는데 인덱스 엔트리는 무엇이고, 인덱스 엔트리는 삭제해도 되는 건지? 만약 삭제하지 않는다면 인덱스 엔트리는 어느 시점에 어떻게 활용하는지?
 
 
 

**"인덱스 엔트리가 뭔지, 이걸 삭제해도 되는지, 안 하면 언제 어떻게 쓰이는지"**를 단계별로 정리해 드릴게요.

✅ 1. 인덱스 엔트리가 뭔가요?

  • 인덱스 엔트리 = (인덱스 키 값, ROWID) 쌍
  • 예: EMP_ID 컬럼에 인덱스가 있고,
    INSERT INTO emp (emp_id, name) VALUES (100, 'Alice') 하면
    인덱스 리프 블록에 아래 엔트리가 삽입됨:
    [100, AAAB12CAAAAAAABAAA] -- 키 값 + ROWID

✅ 2. 이 엔트리를 삭제해도 되나요?

  • DELETE 문 실행 시  자동으로 해당 엔트리도 삭제됨
    (DBMS가 테이블 row와 인덱스 엔트리를 한 쌍으로 관리합니다)
  • 수동으로 인덱스 엔트리만 지우면 안 됩니다
    → 인덱스는 테이블 데이터와 일관성을 유지해야 하므로,
    직접 삭제하거나 건드릴 수 없습니다.

✅ 3. 그럼 안 지워지면 언제 어떻게 활용되나요?

  • SELECT, UPDATE, DELETE 시점에
    옵티마이저가 인덱스를 스캔해서 ROWID를 빠르게 찾을 때 사용됨
  • 예시:
    sql
    SELECT * FROM emp WHERE emp_id = 100;
    → 인덱스 리프 블록에서 100이라는 엔트리를 찾고,
    → 그에 대응하는 ROWID로 테이블 블록 바로 이동  빠른 조회

✅ 4. 인덱스 엔트리가 영구 저장되나요?

  • 테이블에 row가 존재하는 한 → 인덱스 엔트리도 유지됨
  • row 삭제 시 → 인덱스 엔트리도 함께 삭제됨
  •  남는 쓰레기 데이터 없음, 일관성 유지됨

✅ 요약 한 줄

인덱스 엔트리는 (키 값, ROWID) 쌍으로, INSERT 시 생성되고 DELETE 시 자동 삭제되며, SELECT·UPDATE·DELETE 시점에 빠른 ROWID 탐색용으로 활용됩니다. 수동으로 지우거나 관리할 필요 없습니다.
 
 
 
728x90