2009-05-03 9 views

답변

1

인덱스를 사용하는 쿼리에 대한 빠른 액세스를 위해 인덱스 노드가있는 열의 데이터를 저장합니다.

Reference

:

가 INCLUDE (컬럼 [... N])는

가 클러스터되지 않은 인덱스의 리프 수준으로 첨가 될 비 - 키 열을 지정한다. 클러스터되지 않은 색인은 고유하거나 고유하지 않을 수 있습니다.

6

인덱스를 사용하면 전체 레코드의 위치로 연결되거나 필요한 모든 필드를 인덱스 자체에 저장할 수 있으므로 레코드를 완료 할 필요가 없습니다.)

첫 번째 경우에는 두 가지 읽기가 가장 좋은 경우, 하나는 색인 읽기, 다른 하나는 전체 레코드 읽기입니다.

두 번째 경우 색인을 읽는 것만으로 필요한 모든 것을 얻을 수 있습니다.

색인을 구성하는 필드와 함께 여분의 열을 추가하지 않아도 색인을 저장할 수 있습니다.

인덱스를 읽는 것이 전체 행을 읽는 것과 같으므로 CLUSTERED 인덱스의 경우에는 문제가되지 않습니다.

인덱스의 읽기가 서로 인접하게 저장 될 수 있으므로 시퀀스의 여러 인덱스 키 (예 : SELECT ... FROM ... WHERE 키가 n1과 n2 사이)를 읽는 것이 특히 큰 이점이 있습니다. 아마도 하나 또는 두 개의 물리적 섹터만으로 읽을 수 있습니다. 나머지 레코드를 찾을 필요가없는 것은 더 많은 영향력을 제공합니다.

+1

이 매우 – Andomar

0

쿼리가 포함 된 열을 사용하는 경우 키 조회를 수행 할 필요가 없습니다. 예.

select ssn, firstname from myusers where ssn='111-11-1111' 

적절한 인덱스의 당신이 직원 테이블과 같이 있다고 가정하자이

create index idx_user_ssn nonclustered on myusers(ssn) include(firstname) 
+0

에 적용되지 않는 이유의 좋은 설명! – Anoop

29

과 같습니다

CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY, 
         LastName VARCHAR(50), 
         FirstName VARCHAR(50), 
         HireDate DATETIME, 
         Salary DECIMAL) 

당신은 직원 ID의 기본 클러스터 키가, 그리고 아마도 것 이름으로 직원을 찾을 수 있도록 (성, 이름)의 클러스터되지 않은 키. 이제 "조 머피"를 발견하고 자신의 고용 날짜와 급여를 검색해야하는 경우

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 

, 무슨 일 인덱스 (선한) 이름 기반 클러스터되지 않은 키를 추구하지만, 다음 순서로 고용 날짜와 월급을 가져 오려면 SQL Server는 Joe Murphy에 대한 레코드를 얻기 위해 실제 테이블 데이터에 대한 소위 북마크 조회를 수행해야합니다. 이것은 하나 또는 여러 물리적 디스크 액세스 (성능면에서 좋지 않음)가 발생할 가능성이 높습니다.

그러나 :

CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC) 
     INCLUDE (HireDate, Salary) 

다음 SQL 서버는 클러스터되지 않은 이름으로 조 머피를 보았다 된 후에는 수행됩니다 : 당신의 이름 기반 클러스터되지 않은 인덱스는 지정하는 경우 "(HIREDATE, 급여를) 포함" index -> 쿼리를 만족시키는 모든 필드가 클러스터되지 않은 인덱스에 있으므로 디스크 집약적 인 책갈피 조회를 수행 할 필요가 없으므로 쿼리가 훨씬 빨라질 수 있습니다.

INCLUDE 열의 단점은 리프 수준 노드에 포함 된 열이 있으므로 클러스터되지 않은 인덱스가 디스크 공간을 늘릴 필요가 있다는 것입니다. 속도와 크기 사이의 상반 관계입니다 (평소와 같이).

마크

+1

멋진 설명 감사 클러스터 된 인덱스 – Anoop

+1

진심으로 완벽한 감사합니다 ... 매우 –

+1

선명하고 명확한 답변 – Nicool

0

포함 인덱스의 이점은 크기 제한을 피하는 것입니다. 당신은 키 열 등의 모든 열을 정의 할 수 있지만

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode 
FROM Person.Address 
WHERE PostalCode BETWEEN N'98000' and N'99999' 

, 키 크기는 우리가을 PostalCode는, 키가 아닌 컬럼에 keycolumn에서을 PostalCode를 사용하고 휴식하면 성능이 향상됩니다 여기에 사용 334 개 bytes.Only 기준하고 것 또한 크기를 저장합니다.

CREATE INDEX IX_Address_PostalCode 
ON Person.Address (PostalCode) 
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); 
관련 문제