Oracle: 열 순서가 인덱스에서 중요합니까?
두 열의 인덱스는 두 문 중 하나를 사용하여 만들 수 있습니다.
create index foo_ix on foo(a,b);
create index foo_ix on foo(b,a);
이것이 인덱스 사용의 작동(런타임) 특성에 어떤 영향을 미칩니까?
이것이 인덱스의 레이아웃(물리적) 특성에 어떤 영향을 미칩니까?
(1) 또는 (2)가 열의 유형/크기에 영향을 받습니까?
다중 열 인덱스를 만드는 가장 좋은 방법은 무엇입니까?
한마디로 어떤 칸을 먼저 넣는지가 중요한가요?
- 한다면
a
그리고.b
둘 다 1000개의 고유한 값을 가지며 항상 함께 쿼리되므로 인덱스의 열 순서는 중요하지 않습니다.하지만 만약에a
에는 고유한 값이 10개만 있거나 열 중 하나만 사용하는 쿼리가 있으면 상관이 없습니다. 이러한 시나리오에서는 열 순서가 쿼리에 맞지 않으면 인덱스가 사용되지 않을 수 있습니다. - 가장 고유하지 않은 값을 가진 열이 먼저이고 가장 고유한 값을 가진 열이 마지막이어야 합니다.이는 인덱스의 유용성을 극대화할 뿐만 아니라 인덱스 압축의 잠재적 이득을 증가시킵니다.
- 데이터 유형과 열의 길이는 인덱스 압축에서 얻을 수 있는 수익에는 영향을 미치지만 인덱스의 열 순서가 가장 좋은 것은 아닙니다.
- 가장 선택적이지 않은 열을 먼저 정렬하고 가장 선택적인 열을 마지막으로 정렬합니다.자체적으로 사용될 가능성이 높은 칼럼과의 타이 리드의 경우.
2. 및 3.의 한 가지 잠재적 예외는 DATE 열입니다.Oracle DATE 열에는 시간 요소가 포함되어 있기 때문에 하루에 86400개의 고유 값이 있을 수 있습니다.그러나 데이터 열의 대부분의 쿼리는 일반적으로 일 요소에만 관심이 있으므로 계산에 고유한 일 수만 고려할 수 있습니다.비록 소수의 경우에만 상대적인 선택에 영향을 미치지 않을 것이라고 생각하지만요.
편집(닉 피어포인트의 논평에 대한 답변)
가장 덜 선택적인 열로 선두를 달리는 두 가지입니다.
- 인덱스 압축
- 인덱스 건너뛰기 읽기
두 가지 모두 현재 슬롯의 값이 이전 슬롯의 값과 동일하다는 것을 알고 마법을 부립니다.결과적으로 값이 변경되는 횟수를 최소화하여 이러한 기술의 수익을 극대화할 수 있습니다.다음 예제에서는A
한 값과 4개의 고유한 값이 .B
6이 있습니다.디토는 압축 가능한 값 또는 생략 가능한 인덱스 블록을 나타냅니다.
Least selective column leads ...
A B
--------- -
AARDVARK 1
" 2
" 3
" 4
" 5
" 6
DIFFVAL 1
" 2
" 3
" 4
" 5
" 6
OTHERVAL 1
" 2
" 3
" 4
" 5
" 6
WHATEVER 1
" 2
" 3
" 4
" 5
" 6
가장 선택적인 열 리드...
B A
- --------
1 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
2 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
3 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
4 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
5 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
6 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
이 사소한 예에서도(A, B)
18개의 슬롯과 비교하여 20개의 스킵 가능한 슬롯이 있습니다.(B, A)
차이가 클수록 인덱스 압축에 대한 ROI가 향상되거나 인덱스 건너뛰기 읽기의 유틸리티가 향상됩니다.
대부분의 튜닝 휴리스틱과 마찬가지로 실제 값과 실제 볼륨을 사용하여 벤치마크해야 합니다.이것은 분명히 데이터 왜곡이 다양한 접근 방식의 효과에 큰 영향을 미칠 수 있는 시나리오입니다.
"저는 만약 당신이 매우 선택적인 첫 번째 지수를 가지고 있다면 - 성과의 관점에서 - 그것을 우선시하는 것이 좋을 것이라고 생각합니다."
만약 우리가 매우 선택적인 칼럼을 가지고 있다면, 우리는 그것 자체의 색인을 만들어야 합니다.소수의 행에서 FILTER 작업을 피할 수 있는 추가적인 이점은 복합 인덱스를 유지하는 데 따른 오버헤드보다 크지 않습니다.
다중 열 인덱스는 다음과 같은 경우에 가장 유용합니다.
- 둘 이상의 중간 선택 열,
- 동일한 쿼리에서 자주 사용됩니다.
그러나 Oracle 자체에 따르면 카디널리티가 가장 높은 열을 먼저 배치하는 것이 좋습니다.
http://docs.oracle.com/cd/B10500_01/server.920/a96533/data_acc.htm#2174
복합 인덱스에 대한 키 순서 지정
모든 키가 WHERE 절에서 동일하게 자주 사용되는 경우 CREATE INDEX 문에서 이러한 키를 가장 선택적인 것에서 가장 덜 선택적인 것으로 정렬하면 쿼리 성능이 가장 향상됩니다.
다음과 같은 질문에 대한 답을 찾을 수 있습니다.색인 건너뛰기 검색 – 색인 열 순서가 더 이상 중요하지 않습니까? (경고 표시)
- 쿼리에서 열을 단독으로 사용하는 경우 Oracle은 인덱스의 선행 열이 아닌 경우 효율성이 낮은 스캔 인덱스 액세스 경로를 사용합니다.
- 각 열의 선택성에 따라 달라집니다.
- 아니요.
- 인덱스의 열과 관련된 쿼리를 살펴보고 인덱스의 위치를 가장 많이 쿼리된 순서로 순위를 매깁니다.
언급URL : https://stackoverflow.com/questions/2196484/oracle-does-the-column-order-matter-in-an-index
'programing' 카테고리의 다른 글
파이썬에서 사전을 쿼리 문자열로 변환하는 방법은 무엇입니까? (0) | 2023.07.17 |
---|---|
NLTK 토큰라이저를 사용하여 구두점을 제거하는 방법은 무엇입니까? (0) | 2023.07.17 |
그래프(데이터 구조)를 Python으로 표현 (0) | 2023.07.17 |
onAuthStateChanged를 사용한 Float을 사용한 Firebase 로그인 (0) | 2023.07.17 |
오라클 번호 형식의 원치 않는 선행 공백 (0) | 2023.07.07 |