2010-08-10 5 views
1

두 개의 데이터 테이블이있는 경우. 하나는 클러스터 된 색인 CINDEX를 가지며, 다른 하나는 힙 HEAP입니다.클러스터되지 않은 인덱스로 인덱스 액세스

모두 같은 열에 클러스터되지 않은 인덱스가 -

내 클러스터 된 인덱스의 열이 같은 인 ROWID와 같은 크기 때문에 클러스터되지 않은 인덱스 모두의 깊이있는 가정 SEARCHCOL합니다. 적은 I 걸릴 것

는/O의는

a) SELECT * FROM CINDEX WHERE SEARCHCOL = :1 

b) SELECT * FROM HEAP WHERE SEARCHCOL = :1 

이 선택 ... 테이블 행을 가져 또는 b 설명하는 이유 상태에있는 가정

답변

2

Searchcol는 계획을 충분히 선택성이있는 경우 클러스터되지 않은 인덱스 (둘 사이에서 동일 함)에 대한 예상 된 검색을 수행 한 다음 클러스터 된 인덱스 또는 힙을 검색하여 모든 열을 * 프로젝션을 충족시키는 것으로 가져와야합니다. 이 힙 검색은 힙 행이 이동되지 않은 경우 BTree 찾기와 비교하여 힙 (페이지별로 직접 검색 : 슬롯)에서 더 빠를 것입니다 (행이 포함 된 리프 페이지에 1-2 개의 비 리프 페이지를 채워야 함) . 힙 행이 이동 된 경우 조회는 새 페이지에서 전달 포인터를 추적해야합니다. 즉, 새로운 논리 읽기 IO를 의미하며, 여러 번 이동 한 경우 해당 위치를 찾을 때까지 계속됩니다. 따라서 일반적으로 힙은 1-2 논리적 읽기 IO (조회에서 탐색의 비 리프 부분)를 절약합니다.

SEARCHCOL이 충분히 선택 적이 지 않고 쿼리가 Tipping Point에 도달하면 다른 계획은 키순으로 클러스터 된 인덱스를 검색하고 베타는 할당 순서대로 힙을 검색하므로 모든 베팅이 해제됩니다 up과 거의 같은 IO).

그러나이 종류의 미세 관측 (1-2 페이지 IO)은 힙 대 BTree에 대한 결정을 내릴 때 건강하지 못하다는 것을 경고해야합니다. 내 취해야 는 항상 명시 적 이유는하지 않는 한 BTree를 선택합니다. 명시 적 이유는 일반적으로 INSERT 성능 (HEAP가 BTrees 주변에서 원을 실행하는 곳)이며 데이터가 빠른 업로드 성능을 위해 힙에로드 된 다음 Escape 데이터로드 시나리오를 의미하며 힙은 클러스터 된 인덱스로 바뀌고 오퍼레이션을 빅 팩트 테이블로 전환하십시오.

+0

평균 SQL Server 데이터베이스의 미세한 부분 일지 모르지만 고성능 데이터베이스에서 1 ~ 2 개의 IO를 생생하게 조정할 수 있습니다. 나는 질문에 대한 라디오 버튼이 있어야한다고 생각한다. (x) 나는 기업의 큰 소년 대답이 필요하다. 또는 소수의 사용자와 실제 SLA가없는 부서별 앱이있다. 그러나 다시 한번 나는 당신의 의심을 확인해 주셔서 감사합니다. 행이 넓어 질수록 리프 블록 당 행 수가 적을수록 b- 트리 테이블이 깊어 질수록 뚜렷한 IO가 나타나고 더 많은 행이 열리면 더 깊어집니다. 이렇게 넓거나 긴 테이블은 비교적 나 빠지고. –

+0

단일 쿼리에서 하나 또는 두 개의 IO가 아니라 ... 쿼리가 분당 10,000 회 실행되는 것이 확실합니다. –

+0

충분합니다. 클러스터 된 인덱스와 힙 (heap)으로 구성된 테이블 비교 : http://msdn.microsoft.com/en-us/library/cc917672.aspx –

관련 문제