아래 처럼 복합키를 만드는 것이 그리 좋은 방법이 아니라는 설명이 있습니다.
IX01 : ORG_ID + GRP_ID + STRD_ID + STC_DC
그 외 주어진 유일한 단서인 SQL 구문은 아래와 같습니다.
SELECT * FROM PRA_HST_STC A, ODM_RMS B WHERE A.ORG_ID = :ORG_ID AND B.GRP_ID = A.GRP_ID AND B.STRD_ID = A.STRD_ID AND B.TRMS_DT = :TRMS_DT ORDER BY A.STC_DT DESC
전 모르겠습니다. 주어진 단서만으로 저 복합키가 무엇이 문제인지.. ㅠㅠ
많은 가르침 부탁드립니다.
고맙습니다!
일단 틀리더라도 결론을 낸다면
NL 특성상 INNER쪽은 당연히 인덱스가 있다고 가정하고 풀이를 한다면
인덱스는 ORG_ID 1개로만 만들고
정렬도 인덱스 별도로 1개를 만들어 하는 것으로 이해가 됩니다.
ORG_ID + STC_DT 으로 인덱스 만들자니
정렬구문이 ORG_ID + STC_DT가 아닌
STR_DT 1개입니다. 선행 항목 빼고 INDEX_SS로 접근하는 것이 아닌 1개를 인덱스 따로 잡아도 될 것 같습니다.
한편으로는 A테이블쪽에서 4개 속성으로 다 만들어도 DML 부하나 스토리지 비효율은 있지만 역시 조회 비효율은 잘 보이지 않습니다. ㅠㅠ
조회 인덱스와 정렬 인덱스를 따로 만드는 건 거의 본 적이 없는데.. 그게 더 효율적인가요? 음.. 나중에 테스트를 해봐야할 것 같습니다.
책에서 나오는 결합인덱스 효율 문제에서 말하려고 했던 것은
실제 탐색 범위에 영향을 주지 않는 컬럼을 결합인덱스에서 제거하고
ORDER BY 에서 사용하는 컬럼을 탐색조건 컬럼 바로 뒤에 오게 하므로써
인덱스만으로 정렬을 하는 게 효율적이라는 것을 말하려고 했던 것으로 보입니다.
인덱스만 믿고 ORDER BY절을 생략하면 11g nlj_batch 때문에 ORDER BY가 안 될 수도 있다고
설명한 부분도 그런 맥락에서 설명한 것으로 보이구요.
SQLP에서 수도 없이 나와서 저도 당연하게 생각하고 있는 부분인데..
플랜 다양성 보며 정신줄 놓고 있습니다. 시험용이 아닌 정말 성능 위주로 보고 있는데 저는 제대로 개념이 없어서 매우 혼란스러운 상황입니다.
근데 질문있습니다.
12c에서 건수가 적어 그런가 힌트 주지 않으면 해쉬조인 타는데 그래서 nl 힌트 주면
배치 i/o를 탑니다. 그래서 NO_NLJ_BATCHING 힌트를 주면.. 이눔이 PREFETCH를 탑니다. ㅡㅡ;;
그래서 또 NO_NLJ_PREFETCH 힌트를 주면.. 이눔이 멘붕이 오는 것인지 한쪽 힌트를 무시합니다. 물론 저의 무지겠지만.. 아무튼 전통적인 실행계획을 못보고 있습니다. ㅠ ㅠ 갈켜주세요.