2010-11-24 6 views
4

여러 곳에서 인덱스를 작성할 때 성능상의 이유로 가장 우선 순위가 높은 열을 먼저 넣어 두어야한다는 사실을 모든 곳에서 알게되었습니다. 왜 그럴까요? 그것은 신화입니까?다중 열 인덱스 열 순서

+1

와우, 질문에 대한 답변이 많아서 – milan

답변

6

내가

According to Tom 먼저 가장 선택적 열을 놓아야합니다, 열 선택은 인덱스에서 모든 열을 사용하는 쿼리에 대한 성능에 영향을주지 않습니다 (이 인덱스를 압축하는 오라클의 능력에 영향을 미치지 않음).

가장 중요한 것은 아니다. 확실히, 그것은 고려해야 할 것이지만 그것은 사물의 웅장한 계획에 상대적으로 멀리 떨어져 있습니다.

가) 꽤 드문 B)의 값에 진정 따라 사용 (정말 완전히 왜곡 된 데이터로 위와 같이), 선택도 쉽게 문제 그러나, 그들은이되는 수있는 특정 이상한 매우 독특한 비정상적인 경우

런타임시, 왜곡 된 모든 쿼리는

입니다. 따라서 일반적으로 질문을보고,이를 기반으로 필요한 인덱스를 최소화하십시오.

인덱스의 위치를 ​​고려하면 연결 인덱스의 열에있는 고유 값의 수가 관련이 없습니다.

그러나 색인 열 순서를 결정할 때 이러한 고려 사항이 두 번째로되어야합니다. 더 중요한 것은 인덱스가 많은 쿼리에 유용 할 수 있으므로 컬럼 순서는 쿼리의 where 절 (또는 AndreKR이 설명하는 이유로)에서 해당 열의 사용 (또는 그 부족)을 반영해야한다는 것입니다.

색인을 사용하는 방법 - 결정시 관련성이 있습니다.

다른 모든 것들은 동일하지만, 나는 여전히 가장 선택적인 컬럼을 먼저 넣을 것입니다. 그냥 기분이 ...

업데이트 :Another quote from Tom (밀라노에게 감사드립니다.)

오라클 5 (예, 버전 5!)에는 가장 선택적 열을 먼저 색인에 넣는 인수가 있습니다.

그 이후로 가장 식별이 어려운 항목을 인덱스 에 먼저 넣으면 인덱스가 더 작아 지거나 더 효율적이됩니다. 그것은 그렇듯이 보이지만 그렇지 않을 것입니다.

인덱스로는 키 압축을 사용하면 색인을 으로 작게 만들 수 있으므로 다른 방법으로 갈 수있는 매력적인 인수가 있습니다. 그러나 이전에 설명한 것처럼 인덱스 사용 방법에 따라 결정되어야합니다.

+0

인덱스 압축 정보가 약간의 부수적 인 메모가 있지만 무시해서는 안됩니다. 인덱스를 압축하는 것은 멋진 아이디어입니다. – Craig

+0

@Craig : 열 순서가 인덱스 압축에 어떤 영향을 미치는지는 알 수 있지만 다른 방법으로는 작동하지 않을 것입니다 (반복적 인 압축 가능 접두사를 초래하는 하위 카디널리티 선도 열). – Thilo

+0

Tom은 ** Oracle 5 **에 대해 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1296165726968#59899084713981 – milan

6

색인을 사용할 때 오른쪽에서 왼쪽으로 열을 생략 할 수 있습니다. 즉, 색인이 col_a, col_b 인 경우 WHERE col_a = x에서 사용할 수 있지만 WHERE col_b = x에서는 사용할 수 없습니다.

전화 번호부가 으로 정렬되고 그 다음에 성이 인 전화 번호부가 있다고 가정 해보십시오.

적어도 유럽과 미국의 이름은 성보다 선택성이 훨씬 떨어 지므로 이름을 올려도 결과가 많이 줄어들지 않으므로 정확한 성을 확인할 수있는 페이지가 많이 남아 있습니다. .

+5

+1이되지 않습니다. 선행 열이 누락 되어도 인덱스를 계속 사용할 수는 있지만 전체 인덱스 스캔 (또는 인덱스 스킵 스캔)이 가능합니다. 이는 전체 테이블 스캔보다 여전히 효율적일 수 있습니다. – Thilo

+0

이것은 선택성에 관한 부분에 대해서는 대답하지 않습니다. – Thilo

+0

적어도 유럽과 미국의 이름은 성보다 훨씬 낮은 선택성을 가지고 있다고 생각합니다. 그래서 첫 번째 이름의 색인은 처음에는별로 도움이되지 않을 것입니다. – AndreKR

2

색인의 열 순서는 조회에 의해 결정되어야하며 선택성 고려 사항이 아니어야합니다. (a, b, c)에 대한 색인이 있고 대부분의 단일 열 조회가 c 열에 이어 a가 붙는 경우 최상의 효율성을 위해 색인 정의에 c, a, b의 순서로 넣습니다 . 오라클은 쿼리에 대해 인덱스의 가장 자리를 선호하지만 skip-scan이라는 덜 효율적인 액세스 경로에서 인덱스의 다른 컬럼을 사용할 수 있습니다.

1

색인이 더 선택적 일수록 연구가 가장 빠릅니다.

간단히 전화 번호부를 상상해보십시오. 대부분 성으로 빠른 사람을 찾을 수 있습니다. 그러나 같은 성을 가진 많은 사람들이 있다면 매번 이름을보고 그 사람을 찾는 데 더 많은 시간을 할애 할 것입니다.

따라서이 문제를 가능한 한 피하기 위해 가장 선택적인 열을 먼저 제공해야합니다.

또한 쿼리에서 이러한 "선택 기준"을 올바르게 사용하고 있는지 확인해야합니다.

+0

+1이라고 말했습니다. 맞습니다. 이 작업이 완료되었다고 가정하면 (AndrewKR) 열을 오른쪽에서 왼쪽으로 놓을 수 있습니다. – PerformanceDBA