사전 문제
1. 인덱스 레인지 스캔(index range scan)의 경우, 한번의 i/o를 통해 여러개의 블록(block)을 동시에 처리할 수 있다
X : 인덱스 레인지 스캔은 한 번에 한 개의 블록을 처리한다
2. Balanced tree(B*Tree) 인덱스는 데이터를 정렬(sort)하여 저장한다
O : Balanced tree 인덱스의 데이터 저장 방식의 핵심은 정렬이다.
인덱스
인덱스의 필요성
어떨때 쓰는가?
- 테이블의 전체 데이터 중에서 10~15% 이하의 데이터를 처리하는 경우에 효율적임.
그 이상의 경우 사용하지 않는 것이 더 나음
위의 이유~
대부분 B*Tree 구조이기 때문!
Root(기준)/Branch(중간)/Leaf(말단) Node로 구성됨
말 그대로 Tree 구조임!
B*Tree 구조의 핵심은 Sort임. 따라서 Order by에 의한 Sort를 피할 수 있음.
Max/Min의 효율적인 처리가 가능함.
Sort를 피하려는 이유 : Memory를 사용하다 그 용량을 넘을 시 추가 디스크 io가 발생하기 때문.
Order by에 사용되는 컬럼을 B*Tree로 사용 시 Sort 해결이 가능함.
Max/Min에 사용되는 컬럼을 index로 설정 시 바로 1건에 대한 조회가 가능해짐.
인덱스 생성 및 변경 시 고려할 사항
1. 기존 프로그램의 동작에 영향성 검토
2. 필요할 때마다 인덱스 생성으로 인한 인덱스 개수의 증가와 이로 인한 DML 작업의 속도 고려
3. 개별 컬럼의 분포도가 좋지 않더라도 다른 칼럼과 결합하여 자주 사용되고, 결합할 경우 분포도가 양호하다면
결험 인덱스 생성을 긍정적으로 검토할 것.
인덱스 스캔의 원리
옵티마이저가 인덱스 사용을 위한 실행계획을 수립함
1. 조건을 만족하는 최초의 인덱스 row를 찾음
2. Access된 인덱스 row의 ROWID를 이용해서 테이블에 있는 row를 찾음(Random Access)
3. 처리 범위가 끝날 때까지 차례대로 다음 인덱스 row를 찾으면서 Scan
ROWID = 각 인덱스(ROW)가 가지는 unique한 id
INDEX SCAN 종류
INDEX UNIQUE SCAN
- 인덱스 검색 방식 중 가장 빠른 방법임.
- 기본 키 또는 UNIQUE INDEX가 생성 되어 있어야 하며, 인덱스를 구성하고 있는 모든 컬럼이 조건절에서 '='로 비교되야 함.
INDEX RANGE SCAN
- 범위 검색! > < >= <= BETWEEN, NOT BETWEEN 등!
- NOT BETWEEN은 결국 OR로 풀리게 되어 INDEX SCAN이 가능해짐.
- 여러 건이 저장되어 있을 경우에도 INDEX RANGE SCAN을 함!
'DB > SQL튜닝' 카테고리의 다른 글
업무에 바로 쓰는 SQL튜닝 입문 - 4교시(결합인덱스) (0) | 2022.09.25 |
---|---|
업무에 바로 쓰는 SQL튜닝 입문 - 3교시(인덱스) - 1 (0) | 2022.09.25 |
업무에 바로 쓰는 SQL튜닝 입문 - 2교시(옵티마이저) - 2 (0) | 2022.09.25 |
업무에 바로 쓰는 SQL튜닝 입문 - 2교시(옵티마이저) (0) | 2022.09.25 |
업무에 바로 쓰는 SQL튜닝 입문 - 1교시(실행계획) (1) | 2022.09.25 |