-
[Database] - IndexCS/DB 2022. 10. 3. 23:09
Index
Table Address를 미리 저장하면 Mapping 하여 주는 개념
- 논리적/물리적으로 테이블과 독립적
- Table Scan(Full scan)을 하게 되면 O(N)이 들게 되는데 이를 더 효율적으로 탐색하기 위한 방법 O(LogN)
- RDBMS에서 검색 속도를 높이기 위함
- Index는 B-Tree(Balance Tree)
- Join, Where에서 Index가 주로 사용되어 쿼리의 검색 속도를 빠르게 하는데 목적을 가진다.
- Delete,Insert,Update 쿼리에는 Index 사용시 오히려 느리다.
- Insert
- Block에 여유가 없다면, 새로운 Block 할당 후 Key 옮기는 작업 수행
- Index Split 작업 동안, 해당 Block Key 값에 대해 DML이 Blocking -> Wait
- Delete
- Index data 삭제 시에는 사용 X 표시
- Table의 Data 수와 Index의 수가 다를 수 있다.
- Update
- Update시 Index Update 불가
- Delete 후 Insert하는 작업으로 2배의 Resource가 든다.
- Insert
B-Tree
스스로 균형을 찾는 Tree
- Binary Search Tree와 유사하지만, Level을 자동으로 잡아준다.
- Insert, Delete 시간을 희생하면서 Select의 시간을 높인다.
- Root와 Branch는 하위 Block에 대한 Address값을 가지고 있습니다.
- Leaf Node는 양방향 연결 리스트입니다.
- Leaf Node에 저장된 Record(Message)들은 Key 순으로 Sort + Record들의 주소 값(ROWID)를 가지고 있다.
- ROWID = Data Block Address + Row
- Data Block Address = Data File number + Block number
- Block number = Data file 내에서 부여한 상대 순번
- Row = Block 내에서 순번
- 인덱스 탐색
- 수직적 탐색 = Index Scan 시작 지점 찾는 과정
- 수평적 탐색 = Data를 찾는 과정
결합 Index
- 성별 - 이름 과 이름 - 성별로 하였을 때 Index의 구조에 대해서 알아보려고 합니다.
- 성별 - 이름으로 구성한 방법과, 성별 - 이름으로 구성하여도 읽은 index block 갯수가 동일합니다.
- where조건 절에 =으로 검색하는 경우는 index를 앞,뒤에 두든 Block I/O는 갯수가 동일-> 성능 동일
Index 튜닝
- 대량의 데이터에서 소량 데이터를 검색할 떄 사용
- 성능을 좌우하는 역할은 Disk I/O
1. Index scan 튜닝
- Index Scan 과정에서 발생하는 비효율을 줄인다.
- 학생 - 시력 과 같은 Data가 있는 경우를 예를 들겠습니다.
- 시력 - 이름 순으로 되었다면 학생 - 시력 으로 검색하였을 때보다 많은 양의 데이터를 스캔해야 합니다.
- Mssql에서는 내부 동작 시 이를 예측하여 더 빠른 방식으로 동작하게 도와준다고 합니다.
2. Access 최소화 튜닝
- 테이블에 Access하는 횟수를 줄이는 방식
- Record에 Access 시 랜덤 I/O가 사용되어 Resource를 잡아먹는다.
'CS > DB' 카테고리의 다른 글
[Database] - Hash index / B-Tree index (0) 2022.10.06 [Database] - Cardinality / Cluster Index (1) 2022.10.04 Data Lake / Warehouse / Mart (0) 2022.09.19 [MSSQL] 특정 기간 날짜 (MASTER.DBO.SPT_VALUES) (0) 2022.03.21 INDEX 조각화( Rebuild , Reorganize ) (0) 2022.03.04