2012-09-06 2 views
1

나는 기록의 수백만을 포함 할 수있는 SQL 서버 2008 데이터베이스를 만드는거야 내가 정의 할 필요가 있는지 궁금 해서요 인덱스로 다음 단지 0과 1을 포함 할 수tSQL에 대한 색인으로 몇 가지 가능한 값을 가진 열을 설정해야합니까?

  1. TINYINT 열?

  2. TINYINT 열은 0, 5 및 6 만 포함 할 수 있습니까?

ps. 이 두 열은 WHERE 절에서 선택을 위해 사용됩니다.

+0

왜 '0,1' 열에'BIT '가 없습니까? 나중에이 값을 더 많은 값으로 확장 할 수 있습니까? –

+0

좋은 지적. 감사. 나는 그것을 바꿀 것이다. 그럼에도 불구하고 인덱스는 어떻습니까? – c00000fd

답변

5

가 아니,이 컬럼에 인덱스가 혼자 기본적으로 사용하지 않을 것입니다.

그러나 이러한 낮은 선택도 키는 색인의 가장 왼쪽 열에 배치 된 복합 키의 큰 후보를 만듭니다. 예 : TINYINT (0,1) (bit btw?를 사용하지 않는 이유)은 deleted 열입니다. WHERE deleted=0 AND ...으로 술어가 자주 나오는 쿼리가 있습니다. 이것을 클러스터 된 인덱스의 가장 왼쪽 열로 추가하는 것은 매우 적절한 방법입니다. 또는 술어가 예를 들어 WHERE name = '...' AND deleted=0 인 경우 클러스터 화되지 않는 것이 좋습니다 index on (deleted, name).

또 다른 옵션은 filtered index 사용하는 것입니다 create index .. on (name) where (deleted=0)을하지만 이것은 당신 deleted=1에 관심이을있는 경우에는 적용되지 않습니다.

예를 들어, type 열과 같이 별개의 값이 거의없는 열에 대해서도 마찬가지입니다. 다시 말하면, 복합 인덱스의 가장 왼쪽에있는 키를 만드는 것이 일반적으로 의미가 있습니다.

참고 인덱스에서 가장 왼쪽 키와 낮은 선택 키를 추가하고 할 경우하지 술어에이 열을 지정하는 것이하지만 (예를 들면. WHERE name='...'와트/deleted에 대한 어떤 기준을 추가 O) 다음 인덱스가 없습니다 인덱스 on (name) (또는 on (name, ...)) 만 사용할 수 있습니다. 여기서 name은 가장 왼쪽의 키입니다.

왜 가장 키가 작게 만들지 않겠습니까? 예. index on (name, deleted)? 일반적으로 고유 한 제약 조건을 적용하려는 경우에만 일반적으로 이점이 없기 때문입니다. index on (name) 또는 index on (name, deleted) 중에서 선택할 수있는 0 또는 1 만 있으면 기본적으로 동일한 성능을 제공합니다 (사용할 수있는 경우). 낮은 선택도 키를 왼쪽에 놓으면 일부 범위 스캔 시나리오가 가능합니다 (예 : WHERE type=5).

2

인덱스의 선택도가 낮을 ​​것이기 때문에 좋은 생각이 아니며, "속도 향상"대신에 이것이 단점이 될 수 있습니다.

인덱스의 선택도는 더 적은 수의 행이 동일한 값도 전체 테이블 스캔이 더 효과적 일 수있는 몇 가지 다른 경우

을 가지고있다.

1 백만 행이 있다고 가정 해 보겠습니다. 그러면 첫 번째 인덱스의 선택은 :

(선택성 = 고유 값/행) 다른 경우

2/1.000.000 = 0,000002 

:

3/1.000.000 = 0,000003 

이들 값은 매우 낮다!

하거나 다른 방법에 :

기준 선택성 비 ​​= (TotalRows/고유 값)/TotalRows * 100 = 1/Distinc 값 제 경우 * 100

이 50 %로되어 두 번째는 33 %입니다.

SQL Server의 최적화 프로그램은이 비율이 15 % 이상인 인덱스를 사용하지 않습니다.

(내 계산 단순한 추정,하지만 당신은 MSDN에서 통계 정보를 찾을 수 있습니다)

+0

두 컬럼 모두를 의미합니까? – c00000fd

+0

definitly both columns –

+0

호기심에서, 색인으로 적합하려면 컬럼에 어떤 선택성이 있어야합니까? – c00000fd

관련 문제