티스토리 뷰
DB(MS, Oracle, PG, MY..etc)
대체 왜? Select는 좋고, Insert에는 안좋을까? - 인덱스의 내부 작동방식
nwairr 2009. 10. 6. 19:16반응형
괜히 하는일 없이 바쁜 요즘이다.
덕분에 인덱스를 뜯어 보고자 했던 것도
어쩌다보니 좀 미뤄졌는데
더 이상 미루면 안될 것 같아서 다시
키보드를 잡았다. ㅎㅎㅎ
이번에는
인덱스의 내부가 어떻게 이루어져 있는지
그리고, 어떤식으로 동작하는지에 대해서
간략하게 정리해 보도록 하겠다.
참고로 인덱스에 대한 기본설명과
참고로 인덱스에 대한 기본설명과
종류 및 특징에 대해서 아직 이해하지 못했다면
2009/09/22 - [DB(MS, PG, MY..etc)] - 색인(Index)의 기본개념에 대해서
2009/09/24 - [DB(MS, PG, MY..etc)] - 인덱스(Index)의 종류와 특징에 대해
위 링크의 포스팅을 먼저 읽고 오길 바란다.
인덱스의 내부모습
인덱스의 내부모습을 이해하기 위해서 자주 사용되는 그림을 먼저 보길 바란다.
위 그림은 B-Tree(Balanced Tree) 이다.
인덱스가 설정되어 있을 때 Select가 왜 빨라지는지를 설명해 주고 있다.
위 그림에서 봤을 때
B-Tree의 최상위 레벨을 루트노드(Root Node)라고 하고 최하위 레벨을 리프노드(Leaf Node) 라고 한다.
그리고, 여기에서는 레벨이 2단계이지만
레벨이 더 깊어졌을 경우에 루트노드와 리프노드 사이에 존재하는 노드는 중간노드라고 불린다.
용어에 대한 설명은 이쯤으로 하고...
본격적으로 인덱스가 왜 Select에 좋은지에 대한 이야기를 좀 해보도록 하겠다.
위의 그림을 예로 들어서.
만약 인덱스가 설정되어 있지 않았다고 했을 때 '23'이란 데이터를 검색한다면 데이터 검색을 몇 번 해야 할까.
23이란 데이터가 리프노드에 위치해 있고, 게다가 제일 마지막에 있으니 테이블 전체를 뒤져야 할 것이므로
총 16회의 검색이 이루어져야 23이란 데이터를 찾을 수 있다.
이처럼 단순무식하게 처음부터 끝까지 찾는 것을 테이블 스캔이라 한다.
그런데 만약 위 그림처럼 인덱스가 설정되어 있다면 어떨까.
지난번에 설명한 바 있는 넌클러스터 색인을 잠시 떠올려 보길 바란다.
"찾아보기에서 원하는 데이터를 찾아서 색인이 가리키는 페이지로 이동한 뒤, 해당 페이지에서 데이터를 찾는다..."
여기서도 이와 비슷~하게
루트노드의 3번이 가리키는 세번째 리프노드로 가서 23이란 데이터를 찾는 과정이 일어나게 되는데
이 경우 검색 5번만에 원하는 데이터를 찾을 수가 있다.
테이블 스캔의 경우와 비교했을 때 약 3분의 1로 검색속도가 단축이 된다. 솔깃하지 않은가.... 이좋은걸...ㅎㅎㅎ
2009/09/22 - [DB(MS, PG, MY..etc)] - 색인(Index)의 기본개념에 대해서
2009/09/24 - [DB(MS, PG, MY..etc)] - 인덱스(Index)의 종류와 특징에 대해
위 링크의 포스팅을 먼저 읽고 오길 바란다.
인덱스의 내부모습을 이해하기 위해서 자주 사용되는 그림을 먼저 보길 바란다.
위 그림은 B-Tree(Balanced Tree) 이다.
인덱스가 설정되어 있을 때 Select가 왜 빨라지는지를 설명해 주고 있다.
위 그림에서 봤을 때
B-Tree의 최상위 레벨을 루트노드(Root Node)라고 하고 최하위 레벨을 리프노드(Leaf Node) 라고 한다.
그리고, 여기에서는 레벨이 2단계이지만
레벨이 더 깊어졌을 경우에 루트노드와 리프노드 사이에 존재하는 노드는 중간노드라고 불린다.
용어에 대한 설명은 이쯤으로 하고...
본격적으로 인덱스가 왜 Select에 좋은지에 대한 이야기를 좀 해보도록 하겠다.
위의 그림을 예로 들어서.
만약 인덱스가 설정되어 있지 않았다고 했을 때 '23'이란 데이터를 검색한다면 데이터 검색을 몇 번 해야 할까.
23이란 데이터가 리프노드에 위치해 있고, 게다가 제일 마지막에 있으니 테이블 전체를 뒤져야 할 것이므로
총 16회의 검색이 이루어져야 23이란 데이터를 찾을 수 있다.
이처럼 단순무식하게 처음부터 끝까지 찾는 것을 테이블 스캔이라 한다.
그런데 만약 위 그림처럼 인덱스가 설정되어 있다면 어떨까.
지난번에 설명한 바 있는 넌클러스터 색인을 잠시 떠올려 보길 바란다.
"찾아보기에서 원하는 데이터를 찾아서 색인이 가리키는 페이지로 이동한 뒤, 해당 페이지에서 데이터를 찾는다..."
여기서도 이와 비슷~하게
루트노드의 3번이 가리키는 세번째 리프노드로 가서 23이란 데이터를 찾는 과정이 일어나게 되는데
이 경우 검색 5번만에 원하는 데이터를 찾을 수가 있다.
테이블 스캔의 경우와 비교했을 때 약 3분의 1로 검색속도가 단축이 된다. 솔깃하지 않은가.... 이좋은걸...ㅎㅎㅎ
역시나 이 좋은 인덱스에도 치명적인 단점이 존재하는데,
그것이 바로 데이터 변형(Update, Delete, Insert)이 일어났을 경우이다.
다음 그림을 보고 위 그림과 무엇이 다른지를 살펴보길 바란다.
두번째 그림의 시나리오는 데이터 '16'이 Insert되었을 경우를 가정했을 때 일어나는 일을 표현 해 본 것이다.
처음과 비교해 보길 바란다.
데이터값 16이 Insert되기 위해서는 두번째 리프노드 다음에 들어가야 하는데 페이지 공간이 부족하기 때문에
데이터 페이지 스플릿(Split, 분열, 분할)이 일어나게 된다.
즉, 두번 째 리프가 절반으로 나뉘면서 16이란 데이터가 추가될 새로운 리프가 생기는 것이다.
그리고 루트노드에도 새로 추가된 리프 4가 추가 되어 가리키게 된다.
.
.
.
간단하게 설명해 보았으나, 그리 간단하지 않게 되었다. ㅎㅎㅎㅎ
그래도
처음에 던졌던 질문인
왜? Select에는 좋지만, Insert에는 나쁠까?
에 대한 대답은 어느정도 되었을 것으로 생각된다.
다음번에는 좀 더 구체적인 내용을 다루어 보도록 하겠다.
요즘 날씨도 점점 책 읽기에 좋아져 가고,
이렇게 잘 모르던 것에 대해 하나하나 알아나가는 재미 또한 쏠쏠해지니
왠지 모르게 기분이 업되는 가을이다. ㅎㅎㅎ
.
.
.
.
.
(짤방은 요즘 아동관련 어떤 사건때문에 열받아서.... 아오....조두순 죽여버려...)
반응형
'DB(MS, Oracle, PG, MY..etc)' 카테고리의 다른 글
MS-SQL 2008 환경에서 JDBC 적용 및 클래스 패스 설정 (0) | 2011.07.12 |
---|---|
인덱스 재구성 메인터넌스 에러 - 페이지 잠금수준 - 해결방법 (0) | 2010.11.16 |
인덱스(Index)의 종류와 특징에 대해 (4) | 2009.09.24 |
색인(Index)의 기본개념에 대해서 (2) | 2009.09.22 |
SQL 이야기 - Index(색인)에 대해서 (0) | 2009.09.17 |
댓글
반응형
12-01 06:46
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- c#
- 플래쉬 게임
- 브롤스타즈
- brawlstars
- 8비트
- SQL
- XML Programming with VB 6.0
- xml강좌
- 오락실게임
- 고전게임
- 8비트상성
- 고전명작
- 플래쉬게임
- 엑셀
- 좀비게임
- C
- 추억의 게임
- 오락실 게임
- Excel
- 레트로게임
- 중독성짱게임
- 틀린그림찾기
- 플래시
- J.S Bach
- XML
- 플래시 게임
- 다른그림찾기
- 플래시게임
- 플래쉬
- MS-SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함