2009-10-28 2 views
1

열 C1, C2 ... C10이있는 테이블 T가 있다고 가정 해 보겠습니다.동일한 열 조합에 대한 DB2 다중 색인

C1, C2 및 C3은 여러 쿼리에서 가장 자주 언급되는 열입니다. 이 열을 참조하는 순서는 제어 할 수 없습니다.

쿼리 성능을 향상 시키려면 (C1, C2, C3), (C1, C3, C2), (C2, C1, C3), (C2, C3, C1) 등의 여러 인덱스를 만들어야합니다. ? 두 개의 유사한 쿼리 예제

... T1로부터

선택 * , T2 여기서 t1.c1 = t2.c1 및 t1.c2 = T2.C2 및 T3 = t1.c3. C3 및 T1에서

선택 * , t1.c2 = T2.C2 및 t1.c1 = t2.c1 및 t1.c3 = t3.c3

내가 두 개의 인덱스가 필요하십니까 T2 (C1, C2, C3)와 (C2, C1, C3)는 위의 두 개의 서로 다른 쿼리 또는 하나의 조합의 성능을 향상시키기 위해 두 쿼리에 모두 충분합니까?

필자는 이것이 필요하지 않으며 DB2가 C1, C2 및 C3 모두 사용되는 한 인덱스 조합 중 하나와 일치하도록 쿼리의 열을 다시 정렬 할만큼 똑똑하다고 가정합니다.

누구든지 그와 관련된 몇 가지 기사를 확인하고 지적 해 줄 수 있습니까? 사용

DB2 버전

답변

1

데이터베이스 조정 작업을 -와 - 잊지 설정하지 않은 것입니다 AIX 9.5이다, 더 이상은

:-) 버니 Madhoff의 헤지 펀드에 투자하는 것보다 는 는

통 더는 적당히 지능을 제공해야 첫 번째 추측 (예상되는 동작을 기반으로) 및 모니터, 실행중인 쿼리.

최소한 각 열에 대한 색인으로 시작해야합니다. 그런 다음, 누군가 자신의 u 리가 너무 오래 걸린다 고 불평하면 DB2가 u 리를 분석하고 병목이 어디인지 (계획 또는 Visual Explain 설명)를 확인하십시오. 그 시점에서 인덱스를 추가하는 비용이 이익보다 더 중요한지 알아봐야합니다.

데이터베이스가 올바르게 조정되었는지 확인할 수 있습니다.

DB2가 다른 색인을 사용하도록 다시 정렬 할 수 있다는 전제는 전적으로 조회에 달려 있습니다. 가장 단순한 조회를 제외하면 전제 조건이 무효화됩니다.

예를 들어 색인 (c1, c2)이 있다고합시다. 모든 c2 keypart가 아닌 하나 개의 영역에서, 인덱스에 흩어져 있기 때문에 쿼리

select * from t where c2 = '2009-01-01'; 

그 인덱스를 사용하지 것입니다.

그 다음 단지 인덱스에 x2009-01-01를 찾아 볼 수 있기 때문에

select * from t where c2 = '2009-01-01' and c1 = 'x'; 

을 최적화하기 위해 충분한 inteeligent 할 수있다. 그러나

select * from t where c2 <= '2009-01-01' and c2 <= '2009-01-05' and c1 = 'x'; 

는 첫 번째 쿼리와 같은 문제를 앓고 - c2 keypart가 인덱스에 인접하지 않습니다.

그래서 을 측정해야합니다 (추측하지 말 것).

+0

내 질문에 대해 다시 말해 보겠습니다. 모든 열 C1, C2 및 C3이 여러 쿼리 (서로 다른 순서로 사용됨)에서 사용된다고 가정하면이 세 열에 대해 여러 순열 색인이 필요합니다. 예로 – Murthy

+0

... T1, T2 = t1.c1 t2.c1 및 t1.c2 = T2.C2 및 t1.c3 = t3.c3 및 선택 * 에서 선택 * T1에서 T2 여기서 t1.c2 = T2.C2 및 t1.c1 = t2.c1 및 t1.c3 = t3.c3 제가 개의 인덱스 (C1, C2, C3) 및 (C2, C1 필요하십니까 , C3) 위의 두 가지 다른 쿼리 성능을 향상시키기 위해 또는 bo 질문? – Murthy

+0

DB2가 수행 할 작업은 수집 된 통계에 따라 다릅니다. 처리되는 순서는 통계로만 결정될 수있는 결과 세트의 카디널리티에 따라 다릅니다. 나는 (DB2/z를위한 어쨌든, AIX 버전에 대해 모르는) 기본값은 사용할 수있는 통계가없는 경우 주어진 순서대로 처리한다는 것을 확신합니다. 그러나 행동이 거의 확실하게 바뀔 것이기 때문에 대상 환경에서 통계를 수집하고 설명하는 것이 중요합니다. – paxdiablo

1

Linux/UNIX/Windows 용 DB2에서 조회의 술어와 조인 기준은 옵티마이 저의 관점에서 중요하지 않습니다. 옵티 마이저의 u 리 재 작성 부분이 이것을 설명합니다.

쿼리에 따라 최적화 도구 이 (C3, C2, C1) 또는 (C1, C2, C3)에 있는지 여부에 관계없이 인덱스를 선택할 수 있습니다. 그러나 인덱스의 열 순서가 중요하지 않다는 의미는 아닙니다. 일반적으로 가장 높은 카디널리티 순서에서 가장 낮은 카디널리티 순서대로 열을 넣으려고하지만 물론 많은 예외가 있습니다. 적절한 색인 디자인 (Lahdenmaki/Leach의 책은 매우 훌륭함)으로 쓰여진 책 전체가 있습니다. 그래서 이것들을 살펴 보길 권합니다. 나는 DB2에 대한하지만 와트가 발생 오라클에 매우 확실하지 않다

1

우리가 인덱스

말을 만들 때입니다 만들기 T1 (C1)에 INDEX I1;

그러면 열 (c1)에 색인을 만들고 정렬합니다. 귀하의 경우와 같이 지수의

경우;

:

가 T2에 INDEX의 I2를 생성 (C1, C2)

이 정렬 형식으로 데이터를 저장한다. 따라서 마음에 난이 등 아래 위의 인덱스의 첫 번째 열을 쿼리 빠른 것 같아요 유지 : T2

에서

선택 C1, C2

내가 어떤 부분에서 잘못 생각하는 경우 제발 올바른