B-Tree 인덱스 완전 이해 — 동작원리부터 실전 설계까지
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. PostgreSQL B-Tree 인덱스의 리프 노드에 저장되는 값은?
💡 PostgreSQL B-Tree 인덱스 리프 노드에는 TID(ctid — 페이지번호와 오프셋의 쌍)가 저장됩니다. 이를 통해 Heap에서 실제 행을 직접 찾아갑니다. MySQL InnoDB의 Secondary Index가 PK 값을 저장하는 것과 다릅니다.
Q2. 다음 중 B-Tree 인덱스가 사용될 수 없는 WHERE 조건은?
💡 LOWER(name)처럼 컬럼에 함수를 적용하면 일반 B-Tree 인덱스는 사용할 수 없습니다. 해결책은 CREATE INDEX ON users(LOWER(name))처럼 표현식 인덱스를 만드는 것입니다. PostgreSQL은 IS NULL도 B-Tree 인덱스로 처리 가능합니다.
Q3. Index-Only Scan이 성립하기 위한 조건이 아닌 것은?
💡 Index-Only Scan은 (1) SELECT 컬럼이 인덱스에 모두 포함되고 (2) Visibility Map이 해당 페이지를 all-visible로 표시할 때 가능합니다. VACUUM이 VM을 갱신합니다. UNLOGGED TABLE 여부는 관계없습니다.
Q4. PostgreSQL에서 운영 중 다운타임 없이 인덱스를 생성하려면?
💡 CREATE INDEX CONCURRENTLY를 사용하면 테이블에 강한 잠금 없이 인덱스를 생성할 수 있습니다. 다만 두 번의 테이블 스캔이 필요하고, 트랜잭션 내에서는 사용할 수 없습니다.
Q5. 사용되지 않는 인덱스를 찾기 위해 조회해야 할 시스템 뷰는?
💡 pg_stat_user_indexes 뷰의 idx_scan 컬럼이 0이면 해당 인덱스가 한 번도 사용되지 않은 것입니다. pg_indexes는 인덱스 정의만 보여주고 사용 통계는 없습니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.