2009-09-23 2 views
1

: IX_AB은 그 자리에 사용됩니다 : 그것은 중복에 대한지표를 덮으면 더 작은 지표를 안전하게 대체 할 수 있습니까? 예를 들어

Given columns A,B,C,D, 

IX_A is an index on 'A' 

IX_AB is a covering index on 'AB' 

IX_A이 안전하게 제거 할 수 있습니다. 이 일반화 만약 내가 알고 싶은 :

을 내가 가지고있는 경우 등

IX_AB 
IX_ABC 
IX_ABCD 

하고,

가 낮은 인덱스는 여전히 안전하게 제거 할 수 있습니까? 즉, IX_ABC가 IX_AB을 이중화하고 IX_ABCD가 IX_AB와 IX_ABC를 모두 이중화합니까?

답변

3

일반적으로 이것은 서버마다 다르며 덮는 색인은 색인의 더 작은 선택을 다룹니다.

a, b, c를 포함하는 색인이있는 경우 대개 자동으로 a 및 a, b를 다루는 색인이 제공됩니다.

예를 들어, 커버 인덱스 b, c를 가질 수 있다고 보장 할 수는 없습니다.

+0

당신은 분명히 BC의 커버 색인을 가지지 않을 것입니다. 그러나 +1 - A를 찾는 데 AB_IDX를 사용하지 않은 DBMS는 매우 가난합니다. – paxdiablo

+0

나는 A, B, C 커버 인덱스에 B, C를 부여한 좀 더 작은 DBMS를 생각해 낸다. 그러나 SQL Server 나 Oracle과 같은 것은 아닙니다. – Randolpho

+0

인덱스 스캔과 인덱스 스캔에 대해 이야기하는 것 같습니다. 조회에서 선행 열이 사용되면 색인 탐색이 수행됩니다. 컬럼이 인덱스에 있지만 선행 컬럼에는없는 경우 인덱스 스캔 (리프로 직행)이 사용됩니다. – Logicalmind

2

예, 대부분입니다.

그러나 IX_ABCD는 예를 들어 IX_BCD의 대체품으로 대단히 도움이되지 않습니다.

그러나 인덱스에는 여전히 디스크 읽기가 필요할 수 있으므로 C 및 D가 인덱스 크기를 폭발 시키면 찾고있을 때 발생하지 않는 IX_ABCD에서 A, B를 찾는 데 약간의 비효율이 발생합니다 IX_AB에 그것을 위로.

그러나 차이점은 IX_AB를 별도로 유지 관리 할 때 추가로 발생하는 성능 저하 때문일 수 있습니다.

+0

다시 "차이가있을 가능성이 있습니다": 읽기/쓰기 비율에 따라 다릅니다. 극단적 인 경우, 정적 테이블은 많은 인덱스를 가지므로 성능에 영향을 미치지 않습니다. 그러나 디스크 읽기 +1. 좋은 지적입니다. – paxdiablo

1

중요한 것은 색인의 선행 열입니다. 인덱스가있는 경우 IX_ABCD 다음 쿼리는 인덱스를 사용합니다 :

선택 * 테이블의 경우 A = 1

선택 * 테이블의 경우 A = 1, B = 선택 1

* 테이블에서 A는 = 1, B = 1, C = 1

그러나, 다음과 같은 가장 가능성이없는 인덱스를 사용하는 곳 (적어도 당신은 아니다 방법) :

선택 * 테이블에서 B = 1

,

선택 * 테이블 여기서 C = 1

선택 * B = 1과 C = 1

가 중요한 점은 선행 컬럼이 사용되는 테이블. 따라서 색인이 작성 될 때 열의 순서가 중요합니다.

0

반드시 그렇지는 않습니다. (A, B, C)에 대한 색인이 A에 대한 필터링 술어 또는 A에 대한 순서 요청 또는 A에 대한 조인 조건에 사용될 수 있지만 사실은 색인 (A)만이 쓸모 없다는 것을 의미하지는 않습니다 .(A, B, C)의 인덱스가 (A)보다 상당히 큰 경우 인 경우 적은 수의 페이지 (좁은 인덱스)를 읽어야하기 때문에 A에서만 범위 스캔을 수행하면 상당한 I/O가 절약됩니다.

나는 규칙이 아니라 예외가 될 것이라고 생각합니다. 일반적으로 (A, B)에 다른 색인이있는 경우 A에 대한 색인을 제거하는 것이 안전합니다. (A, B)의 인덱스는 B의 필터링을 만족시키지 않으므로 맨 왼쪽 열이 동일한 경우에만 제거하는 것이 안전합니다. 일부 데이터베이스는 B를 찾기 위해 (A, B)에 색인을 사용할 수있는 '건너 뛰기 스캔'연산자를 가지고 있지만 매우 좁은 경계 사례입니다.

0

데이터베이스 엔진 내부에 대해 아무 것도 생각하지 않고 실제로 사용되는 실제 쿼리 계획을 실제로 확인하지 않는 것이 가장 좋습니다.