Sql 서버 의 집합 색인 이해

색인 을 모 으 는 것 에 대해 말하자면 모든 야드 농 사 는 다 알 고 있 지만 나 같은 찌 질 한 프로그래머 도 많아 서 억지로 외 워 서 이 문 제 를 해결 할 수 밖 에 없다.어떤 표 에 하나의 집합 색인 만 만 만 들 고 목록 을 잡 아 독자 의 기억 을 도 울 수 있 는 지.문 제 는 바로 여기에 있다.우 리 는 문과 가 아니다.우 리 는 모두 색인 을 모 으 는 것 을 좋아한다.왜냐하면 그것 은 무질서 한 시 계 를 질서 있 게 기록 할 수 있 고 B 나 무 를 가지 고 놀 수 있 기 때문이다.이렇게 해서 복잡 도 를 N 에서 LogMN 으로 낮 추 었 습 니 다.
이렇게 되면 논리 적 으로 읽 으 면 물리 적 으로 읽 을 수 있다.
 현상
1:색인 없 는 경우
아니면 낡은 규칙 입 니까?예 를 들 어 느끼 세 요.먼저 저 는 제품 표를 가지 고 있 습 니 다.안에 색인 이 없습니다.다음 과 같은 그림 입 니 다.

위의 그림 에서 저 는 비극 적 으로 보 았 습 니 다.물리 독 서 는 9 번 입 니 다.즉,하 드 디스크 를 9 번 간 것 을 설명 합 니 다.하 드 디스크 를 가 는 목적 은 데 이 터 를 가 지 려 는 것 이 고 논리 적 으로 1636 번 읽 었 습 니 다.주의해 야 할 것 은 여기 의'회'는'페이지'라 는 뜻 입 니 다.즉,메모리 에서 1636 개의 데이터 페이지 를 걸 었 습 니 다.제 가 dbcc ind 로 보 여 드 리 겠 습 니 다.1636 개의 표 데이터 페이지 가 있 는 지 아 닌 지 를 보 여 드 리 겠 습 니 다.

여기에 1637 개의 데이터 페이지 가 있 는 이 유 는 첫 번 째 가 IAM 추적 페이지 였 기 때문이다.

 2:색인 을 모 으 는 경우
     다음은 제 가 Product 표 에 produt 을 만 들 겠 습 니 다.idx_productid 의 집합 색인 을 보고 io 상황 을 다시 보 세 요.다음 그림:

이 논리 가 세 번 읽 히 는 것 을 보 았 을 때 당신 은 이미 미 쳤 습 니까?무려 1636 개 데이터 페이지 에서 목표 데 이 터 를 찾 으 려 면 3 번 만...이것 은 알고리즘 맹 이 보기에 신 이 아 닌 것 같다.
신선 이 인간 세상 에 내려오다.물론,이 물건 은 하늘 에 도 있 고,인간 세상 에 도 있다.있 으 면 아주 강 한 탐색 욕 이 있어 야 지...이 안에 어떻게 노 는 지...
 2.탐색 원리
1:잎 사 귀 탐색 노드
아까 도 말씀 드 렸 듯 이 색인 을 모 아 노 는 것 이 바로 B 나무 입 니 다.B 나무 인 이상 잎 노드 와 가지 노드 가 있 습 니 다.전문 용 어 는 도 0 의 잎 노드 이 고 도>0 의 것 을 가지 노드 라 고 합 니 다.
나 는 당신 도 들 었 을 것 이 라 고 생각 합 니 다.색인 을 모 으 는 것 은 색인 열 데 이 터 를 정렬 한 후에 B 트 리 에 넣 는 것 입 니 다.그러면 눈 에 띄 게 하기 위해 서 나 는 먼저 ID 무질서 한 3 개의 기록 을 만 들 겠 습 니 다.

dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)
그리고 dbcc ind 명령 으로 세 개의 데이터 페이지 에 기록 되 어 있 는 지 확인 합 니 다.그림:

그림 에서 볼 수 있 듯 이 나의 세 가지 기록 은 148 번 데이터 페이지 에 놓 여 있다.그리고 나 는 148 번 데이터 페이지 를 내 보 내 내용 이 무엇 인지 보 았 다.

dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)

위의 그림 에서 우 리 는'데이터 페이지'의 각 슬롯 의 지향 은 표 의 실제 저장 기록 에 따라 이 루어 진 것 을 보 았 습 니 다.자,다음은 제 가 집합 색인 을 만들어 서 실제 데이터 가 정말 질서 가 있 는 지 확인 하 겠 습 니 다.

create clustered index Ctrip_idx_ID on Person(ID)

그런데 여기 재 미 있 는 질문 이 있 습 니 다.제 148 호 표 데이터 페이지 가 어디 갔 죠?역시 기발 하 다.확실히 173 번 색인 페이지 로 바 뀌 었 다.그러면 데이터 의 완전 성 을 확보 하기 위해 148 번 데이터 페이지 의 내용 을 173 색인 페이지 에 넣 었 겠 지????괜찮아,검증 해 봐.

dbcc traceon(3604)
dbcc page(Ctrip,1,173,1)

위의 그림 을 통 해 직관 적 으로 느 낄 수 있 습 니까?데 이 터 는 현재 aaaa,bbbb,ccccc 모드 입 니 다...질서 가 서다.동시에 색인 페이지 에 도 148 호 데이터 가 저장 되 어 있다.
페이지 의 필드 값,예 를 들 어 ID,Name 정보,아래 의 slot 0 슬롯 을 예 로 들 면:
 
 여기까지,나 는 당신 이 잎 노드 의 내용 에 대해 대략적인 인식 을 가지 게 되 었 다 고 생각 합 니 다.적어도 당신 에 게 억지로 외우 게 하 지 는 않 았 을 것 입 니 다~~~
 2:탐색 분기 노드
당신 에 게 분기 노드 를 보 여주 기 위해 서 나 는 데 이 터 를 좀 더 넣 어야 합 니 다.어쨌든 데이터 가 색인 데이터 페이지 를 깨 뜨 려 야 합 니 다.그러면 분기 노드 색인 데이터 페이지 가 나 옵 니 다.아래 의 예 를 보 세 요.

그림 에서 볼 수 있 듯 이 내 가 1000 개의 데 이 터 를 삽입 할 때 이미 하나의 분기 노드(120 번 색인 데이터 페이지),세 개의 잎 노드(173,121,126),잎 이 나 타 났 다.
노드 의 데이터 페이지 내용 은 저도 말 했 습 니 다.지금 은'분기 노드'에 어떤 내용 이 저장 되 어 있 는 지 궁금 합 니 다.?나 는 매우 흥분 했다.나 는 120 번 색인 데이터 페이지 를 내 보 낼 것 이다.

dbcc traceon(3604)
dbcc page(Ctrip,1,120,1)

slot 0:0600000 00ad 0000 000100 의 내용 을 간단하게 분석 합 니 다.
0000000:잎 색인 페이지 의 최소 key 값(여 기 는 좀 특수 합 니 다.한 줄 의 기록 이 최소 값 을 저장 하지 않 는 것 을 제외 하고 나머지 는 모두 그렇습니다)을 10 진법 으로 바 꾸 면 0 입 니 다.
ad 000000:잎 색인 페이지 의 페이지 번 호 를 10 진법 으로 바 꾸 면 173 입 니 다.
0100:잎 색인 페이지 의 파일 번호,10 진법 으로 바 꾸 면 1.
그러나 분석 을 통 해 우 리 는 사실 분기 노드 에 두 개의 값 이 저장 되 어 있 고 하나의 childpage 의 minkey,하나의 childpage 의 pageid,같은 이치 로 다른 슬롯 도 마찬가지 라 는 것 을 알 게 되 었 다.
우 리 는 매개 변수 명령 을 바 꾸 어 결 과 를 더욱 직접적 으로 보 여 줍 니 다.기록 에는'pageID'와'minkey'가 저장 되 어 있 습 니 다.

 
이렇게 되면 내 머 릿 속 에 그림 이 한 장 나 와.너 지금 있 는 지 없 는 지 모 르 겠 어???

위의 분석 을 통 해 첫 번 째 줄 기록 은 하위 색인 페이지 의 최소 key 값 을 저장 하 는 것 이 아니 라 다른 기록 은 모두 하위 색인 페이지 의 최소 색인 키 값 을 추출 하 는 것 이 므 로 주의해 야 한다.
아마도 sqlserver 팀 에 게 는 449 보다 작다 고 판단 하면 바로(1:173)데이터 페이지 로 가 고 889 보다 작은 것 은 직접(1:121)데이터 페이지 로 가면 될 것 입 니 다.
 당신 이 이곳 을 보 았 을 때,당신 은 왜 표 에 하나의 집합 색인 만 있 는 지 이미 알 고 있 습 니까?자,잡담 을 많이 했 으 니 도움 이 되 었 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기