간단명료

인덱스 본문

SQL/업무에 바로 쓰는 SQL튜닝 입문

인덱스

FeelGoood 2022. 3. 26. 13:31

데이터베이스에 저장된 자료를 더욱 빠르게 조회하기 위해 사용.
일반적으로, 인덱스는 테이블의 전체 데이터 중에서 10~15% 이하의 데이터를 처리하는 경우에 효율적이며, 그 이상의 데이터를 처리할 땐 인덱스를 사용하지 않는 것이 더 나음.

B* TREE 구조 (Balanced Tree)

Root(기준)/Branch(중간)/Leaf(말단) Node로 구성 됨
Branch 노드는 Leaf 노드에 연결되어 있으며, 조회하려는 값이 있는 Leaf 노드까지 도달하기 위해 비교/분기해야 될 값이 저장 됨

Leaf 노드 = 인덱스 컬럼 값 + ROWID
-- ROWID : 테이블에 있는 row를 찾기 위해 사용되는 저장위치(논리적인) 정보
-- Sorting 되어 저장
AAAE6TAAEAAA5K2AAA
 1   2   3   4

1) 6자리 : 데이터 오브젝트 번호 (Data Object Number) - 오브젝트 고유 번호(테이블정보)
2) 3자리 : 상대적 파일 번호(Reative File Number) - 각각의 데이터파일에 할당되는 번호(파일정보)
3) 6자리 : 블록 번호(Block Number) - 데이터 블록의 위치를 알려주는 번호(블럭정보)
4) 3자리 : 블록내의 행 번호(Row Number)
- 오라클 블록의 헤더에 저장된 Row Directory Slot의 위치를 알려주는 고유 번호(블록 안에 몇 번째에 있는지 알려주는 Row 순서 정보)

B* Tree 구조의 핵심은 Sort!

  1. ORDER BY 에 의한 Sort 작업을 피할 수 있음
  2. MAX/MIN 효율적인 연산 가능

인덱스 생성 및 변경 시 고려 사항

  1. 인덱스가 추가 될 경우 기존 프로그램 동작의 영향성 검토
  2. 필요할 때마다 인덱스를 생성할 경우, DML작업속도는 저하됨
  3. 개별 칼럼의 부포도가 좋지 않더라도 다른 칼럼과 결합하여 자주 사용된다면 결합 인덱스 생성을 검토해야 함

인덱스 스캔 원리

  • 옵티마이저가 인덱스 사용을 위한 실행계획을 수립
  • 인덱스 스캔 시에는 한 번의 I/O가 발생할 때마다 한 개의 Block씩 처리
  1. 조건을 만족하는 최초의 인덱스 row 탐색.
  2. Access된 인덱스 row의 ROWID를 이용해서 테이블에 있는 row 탐색(Random Access)
  3. 처리 범위가 끝날 때까지 차례대로 다음 인덱스 row를 찾으면서(Scan) 2 반복
  • 인덱스 스캔 시에는 한 번의 I/O가 발생할 때 마다 한 개의 Block 씩을 처리 함

인덱스의 필요성

  • 고유(Unique) 인덱스의 Equal(=)과 범위(Range) 검색
  • 중복(Non_Unique) 인덱스의 범위(Range) 검색
  • OR & IN 조건 - 결과의 결합
  • NOT BETWEEN 검색(=OR작업과 동일)

                                     

출처 : EZ Learning - [업무에 바로 쓰는 SQL튜닝 입문] 강의
728x90
반응형

'SQL > 업무에 바로 쓰는 SQL튜닝 입문' 카테고리의 다른 글

인덱스 활용이 불가능한 경우  (0) 2022.03.26
결합인덱스  (0) 2022.03.26
옵티마이저  (0) 2022.03.26
실행계획 종류(EXPLAIN PLAN, SET AUTOTRACE)  (0) 2022.03.26
SQL 튜닝 강의 시험 오답  (0) 2022.03.25
Comments