인덱스를 정의 할 때 특정 열 순서에 이점이 있습니까?


13

예를 들어 두 개의 인덱스가있는 경우 :

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

이것이 IDX_2중복이됩니까? 그렇지 않은 경우 열 선언 순서를 어떻게 결정합니까?

일반 쿼리에 맞게 인덱스를 조정해야합니까?

답변:


12

예. 인덱스의 일부를 쿼리하려고 할 때 이점이 있습니다. 부분 사용 술어를 먼저 넣으면 인덱스의 모든 열이 아닌 해당 술어를 포함하는 쿼리에 인덱스를 사용할 수 있습니다.

또한 다른 요구 사항이 없으면 인덱스 탐색 조작을 더 빨리 다룰 수 있으므로 가장 선택적인 술어를 먼저 배치하는 데 도움이 될 수 있습니다.

귀하의 경우 IDX_2테이블의 쿼리 특성에 따라 반드시 중복되는 것은 아닙니다. 그러나 모든 열을 포함 할 필요는 없습니다. 예를 들어, 당신은에 의해 쿼리를 많이 할 경우 locationdate다음 IDX_2으로 그 쿼리를 해결하는 데 도움이에게 유용 할 수있는 IDX_1이 유용 할 수있는 권리 순서에 있지 않습니다. 그러나에 item중복되는 것을 찾을 수 있습니다 IDX_2.

9i부터 Oracle은 후행 인덱스 열을보다 효율적으로 쿼리 할 수 있는 '건너 뛰기 스캔' 연산자를 도입하여 이러한 종류의 보충 인덱스의 필요성을 줄일 수 있습니다.

보다 구체적인 경우, 쿼리하는 경우 itemlocation하고 date테이블에서 아무것도 읽을 필요없이 다음 쿼리가 완전히 인덱스 불구하고 해결 될 수있는 다른 열을 필요로하지 않습니다. 색인화되지 않은 열이 연결된 색인을 포함 할 수도 있습니다. 포함 인덱스에서 필요한 모든 열을 해결할 수있는 경우 쿼리는 기본 테이블을 전혀 건드릴 필요가 없습니다.

마지막으로, 마지막 질문에 대한 답으로 : 많은 리소스를 사용하고 색인을 사용하여 조정할 수있는 정기적으로 사용되는 쿼리 세트가있는 경우 고려할 가치가 있습니다. 그러나 인덱스 유지 관리에는 인서트 오버 헤드가 포함되므로 인덱스가 인서트 또는 업데이트 작업에서 발생하는 오버 헤드와 쿼리 성능을 떨어 뜨려야합니다.


3
@ConcernedOfTunbridgeWells : 다른 방법은 인덱스 키 압축을 사용하고 덜 선택적인 (더 작은 값) 열을 사용하는 것입니다. 스킵 스캔이 여전히 잘 작동하는 동안 인덱스를 작게 만들 수 있습니다.
Adam Musch

2

고려해야 할 또 다른 사항은 null 값이 많은 열입니다.

이 열에 색인에서 지정된 열이 있으면 널값을 색인화해야합니다. 그렇지 않으면 평소와 같이 null 값은 색인화되지 않습니다 (물론 b- 트리 색인을 사용한다고 가정합니다).

따라서 많은 수의 널값을 가진 열이있는 경우, 색인의 끝에 열을 넣으면 상당한 디스크 공간을 절약 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.