2013-03-27 4 views
6

최근 데이터베이스 튜닝을 시작했습니다. SQL Server에 대한 몇 가지 아이디어가 있고 인덱스를 만들기로 결정했습니다. 색인 생성 SQL Server 2008

http://sqlserverplanet.com/ddl/create-index

참조 된하지만 난, WITH 옵션은 어떻게 다른 인덱스의 유형 INCLUDE 같은 도움이 될 것입니다 이해가 안 돼요. 나는 구글을 시도했지만 그걸 사용할 때 간단한 설명을 보지 못했습니다.

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
INCLUDE (President,YearsInOffice,RatingPoints) 
WHERE ElectoralVotes IS NOT NULL 

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
WITH (DATA_COMPRESSION = ROW) 

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
WITH (DATA_COMPRESSION = PAGE) 

위의 시나리오를 사용해야합니까? 성능이 향상 될 것인가?

답변

2

데이터 압축 옵션을 사용할 수는 없지만 포함 옵션을 사용하면 성능이 확실히 향상 될 수 있습니다. PresidentNumber와 President, YearsInOffice 또는 RatingPoints 열 중 하나 이상을 선택하고 ElectoralVotes가 null이 아닌 경우 쿼리는 인덱스 자체에서 값을 가져오고 기본 테이블을 건드릴 필요가 없습니다. 테이블에 추가 열이 있고 그 중 하나를 u 리에 포함 시키면 테이블과 인덱스에서 값을 검색해야합니다.


Select top 20 PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
where ElectoralVotes IS NOT NULL 

위의 쿼리는 IX_NC_PresidentNumber 읽고

Select top 20 PresidentNumber, President, YearsInOffice, PoliticalParty 
From Presidents 
where ElectoralVotes IS NOT NULL 

이 쿼리가 사용하는 쿼리의 모든 열이 인덱스에 포함되어 있기 때문에 대통령 테이블에서 데이터를 끌어 할 필요가 없습니다 쿼리의 PoliticalParty 열이 인덱스에 포함되어 있지 않기 때문에 IX_NC_PresidentNumber 인덱스와 Presidents 테이블도 함께 사용합니다.

Select PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
Where RatingPoints > 50 

이 쿼리는 대부분 테이블 스캔을하고 끝날 것 때문에 일치하지 않는 인덱스에 사용되는 where 절, 거기 행 개수에 제한 대 쿼리의 where 절.

+0

샘플 검색어를 여기에 추가해주십시오. 그것은 쉽게 생각하고 이해하는 데 도움이됩니다 :) – Billa

+0

괜찮아. 따라서 좋은 성능을 얻으려면 SELECT 문에있는 모든 열에 Index를 추가해야합니까? 테이블 스캔을 피하십시오. – Billa

+0

아니요, 테이블 스캔을 피하기 위해 인덱스에 모든 열을 추가 할 필요가 없습니다. 테이블 스캔을 피하려면 where 절에서 사용하는 열에 대해 인덱스가 있어야합니다. 색인에 행에 대한 포인터가 포함되어 있으므로 색인의 모든 열을 가져서 성능이 향상됩니다. 커다란 이득은 필터 열에 인덱스가있는 것입니다. – BlackICE

4

데이터 압축을 사용하면 쿼리를 실행할 때, 적은 페이지/정도는 항상 좋은 선택이다 I/O를 줄이고, I 이후/O가 감소하고,로드됩니다, 압축 후부터 너무 쿼리 성능을 도움이 될 것입니다.