Sql 서버 의 표 스 캔 을 깊이 이해 합 니 다.
표 스 캔
1.현상
'표 스 캔'은 듣 기 에 매우 간단 하 다.한 줄 한 줄 의 스 캔 이 잖 아.'실행 계획'이 라 고 하면 나 도 놀 것 이다.더 보기 위해 서 나 는 시 계 를 만 들 고 세 줄 의 데 이 터 를 삽입 할 것 이다.다음 과 같은 그림 이다.
위의 Person 은 색인 을 만 들 지 않 았 습 니 다.그리고 where,시계 스 캔 이 어떤 지 볼 까요?
역시 극악무도 한'시계 스캐닝'세 글 자 를 보 았 다.극악무도 한 것 이 니 우 리 는 반드시 깊이 이해 한 후에 야 우 리 는 어떻게 그것 을 피 할 수 있 는 지 방법 을 생각해 야 한다.그래서 우 리 는 반드시 본질 을 이해 해 야 한다.그 문제 가 왔 다.그것 은 도대체 어떻게 쓸 었 을 까??어떻게 터 지지?이것 은 반드시 데이터 페이지 에서 말 해 야 한다.
2.표 스 캔 깊이 이해
1:데이터 페이지
이 학 sqlserver 는 모른다 고 말 할 이유 가 없습니다.우리 의 기록 은 모두 데이터 페이지 형식 으로 저장 되 고 데이터 페이지 의 크기 가 8k 라 는 것 도 알 아야 합 니 다.그 데이터 페이지 는 어디 에 있 습 니까?할 수 있어 요.
네 눈 에 보 이 는 것 이 확실 하 다.
언뜻 보기 에는 내 가 그림 을 많이 그 렸 으 니 절대 두려워 하지 마 세 요.많이 그 렸 다 고 해서 심오 하 다 고 생각 하지 마 세 요...........................................간단하게 분석 해 볼 게 요.
<1>:dbcc ind 명령
데이터 페이지 와 관련 된 상황 을 보고 싶다 면,sqlserver 는 정말 전용 명령 dbcc 를 제공 하여 당신 을 만족 시 켰 습 니 다.sqlserver 에 ind 명령 을 제공 하 는 인자 가 있 습 니까?알려 줄 게,있 네.
네,그런데 이 건 2588 추적 을 켜 야 합 니 다.아래 처럼.
<2>:PageFID,PagePID,IAMFID
아까 말씀 드 렸 듯 이 데이터 페이지 는 여러 가지 가 있 습 니 다.기본 적 으로 말 하면 모두 표 데이터 페이지 입 니 다.사실은 IAM 데이터 페이지 도 있 습 니 다.이상 한 것 이 없습니다.IAM 은 표 데이터 페이지 를 추적 하 는 데 사 용 됩 니 다.그래서 위의 그림 에서 IAMFID 필드 가 Null 인 기록 은 바로 IAM 페이지 이 고 아래 의 PagePID=78 은 표 데이터 페이지 입 니 다.
2.데이터 페이지 보기
여러분 이 헷 갈 리 지 않도록 먼저 데이터 페이지 내부 구조 가 어떤 모습 인지 말씀 드 려 서 전체적인 인상 을 드 리 겠 습 니 다.
그림 에서 볼 수 있 듯 이 데이터 페이지 의 끝부분 에 많은 슬롯 이 있 습 니 다.이 슬롯 은 Data 구역 에 실제 기 록 된 주 소 를 가리 키 기 때문에 표 스 캔 은 바로 이 Slot 슬롯 을 스 캔 하 는 것 입 니 다.
아니면 위 에 있 는 Person 표 의 세 가지 기록 을 가지 고 말 하면 그들 은 모두 78 번 데이터 페이지 에 저장 되 어 있 는데 지금 은 호기심 으로 78 번 데이터 페이지 를 유도 해서 말 하면 한다...아주 간단 합 니 다.
두 가지 일 을 해 야 한다.
<1>3604 추적 오픈:dbcc traceon(3604)
<2>dbcc page 명령 을 사용 하여 1 번 파일 아래 78 번 데이터 페이지(pageFID:pagePID)=(1:78)를 내 보 냅 니 다.아래 와 같이...
데이터 페이지(PAGE HEADER):
데이터 내용(페이지 데이터):
데이터 슬롯 위치(Page Slot):
위(0,1,2)세 개의 슬롯 을 보 았 는 지,그리고 모두 해당 하 는 오프셋 주소(0x7e,0x92,0xba)가 있 습 니 다.이 주 소 는 Data 구역 의 실제 기록 한 오프셋 주 소 를 가리 키 고 있 습 니 다.
자,이제 그만 하 자.더 이상 말 하면 안 돼.씻 고 자.