결합 인덱스와 단일 인덱스에 대한 궁금합니다 0 4 487

by 미친감자 [Oracle 기초] 인덱스 [2021.11.22 09:54:37]


테이블에 인덱스를 생성하려는 데요

화면에 검색조건이 여러개 있습니다

=======================================================================================

화면1 검색조건 : 결제사거래승인일 / 점포 / 결제구분 / 제휴구분 / 주문ID / 사업부 / 결제사 , 필수검색조건 : 결제사거래승인일

화면2 검색조건 : 매출일자 / 점포 / 결제구분 / 제휴구분 / 주문ID / 사업부 / 결제사 , 필수검색조건 : 매출일자

=======================================================================================

위와 같은데요

집계용 테이블 조회라 딱 저 두화면에서만 사용합니다.

그래서 인덱스도 그 두화면의 쿼리에 맞게 생성하려고 합니다.

결합인덱스로 해서 아래와 같이 생성했습니다.

-------------------------------------------------------------------------------------------------------------------------------------------------

화면1  쿼리를 위한 결합인덱스 컬럼 : 결제사거래승인일 / 점포 / 결제구분 / 결제구분상세 / 제휴구분 / 주문ID / 사업부 / 결제사, (이 순서대로 인덱스 컬럼을 구성했습니다)

화면2  쿼리를 위한 결합인덱스 컬럼 : 매출일자 / 점포 / 결제구분 / 결제구분상세 / 제휴구분 / 주문ID / 사업부 / 결제사, (이 순서대로 인덱스 컬럼을 구성했습니다)

------------------------------------------------------------------------------------------------------------------------------------------------

 

그런데 PM이 결합 인덱스 컬럼이 너무 많다고 줄여야 한다고 결합인덱스를 아래와 같이 변경했습니다

---------------------------------------------------------------------------------------

인덱스 1 컬럼 : 결제사거래승인일

인덱스 2 컬럼 : 매출일자

인덱스 3 컬럼 : 매출일자 / 결제구분 / 결제구분상세

인덱스 4 컬럼 : 결제사거래승인일/ 결제구분 / 결제구분상세

---------------------------------------------------------------------------------------

그리고 PK 로 인한 기본인덱스가 아래와 같습니다

PK 인덱스 : 주문ID / 주문상세일련번호

 

이런 상황이고 아래의 컬럼들은 중복도가 높습니다

제휴구분 : 가능한 값 종류 2개
사업부 : 가능한 값 종류 2개
결제사 : 가능한 값 종류 10여개

 

제가 개발자라 잘 알지는 못하지만 결합인덱스는 인덱스로 구성된 첫번째 컬럼이 WHERE 구문에 없으면 옵티마이저가

해당 인덱스를 타지 않는다고 알고 있는데요

만약 매출일자 / 주문ID 로 화면에서 조회할 경우 옵티마이저는 인덱스를 제대로 탈까요?

현재 구성된 인덱스가 아래와 같은 상황에서 매출일자 / 주문ID로 구성된 인덱스가 없을 경우 인덱스를 타게 될지,

인덱스를 탄다면 어떻게 타게 되는건지 궁금해서요

(실행계획을 보면 되겠지만 혹시 몰라서 질문드립니다)

-------------------------------------------------------------------

PK 인덱스 : 주문ID / 주문상세일련번호

인덱스 1 컬럼 : 결제사거래승인일

인덱스 2 컬럼 : 매출일자

인덱스 3 컬럼 : 매출일자 / 결제구분 / 결제구분상세

인덱스 4 컬럼 : 결제사거래승인일/ 결제구분 / 결제구분상세

-------------------------------------------------------------------

 

그리고 위와 같은 조건에서 결합인덱스로 컬럼 A, B, C, D 를 만들어서 컬럼 A, C 조건으로 조회하는 것과

단일인덱스로 해서

인덱스 01 : A / 인덱스 02 : B / 인덱스 03 : C / 인덱스 04 : D 를 만들어서 컬럼 A, C 조건으로 조회화는 것 중

어떤 것이 조회 퍼포먼스에 더 좋을까요?

 

실행계획을 보면 되겠지만, 뭔가 그 원리라든가 그런게 궁금해서 질문드립니다.

감사합니다

 

 

 

by 마농 [2021.11.22 10:05:14]

1. 필수 검색 조건 뿐 아니라
- 자주 검색되는 조건 조합을 선정해야 합니다.
- 일자 조건이 이퀄 조건인지 범위 조건인지도 따져봐야 합니다.
2. PM 이 선택한 인덱스 중에 단일인덱스는 불필요합니다.
- 복합인덱스가 이미 단일인덱스 항목을 선두컬럼으로 가지고 있으므로.
3. 주문ID 는 이미 PK 이므로
- 주문ID 조건이 들어오면 좋은 성능을 낼 것입니다.


by 미친감자 [2021.11.22 10:37:58]

답변 주셔서 정말 감사드립니다 ^^

일자 조건은 범위 조건입니다

조언 주셔서 정말 감사합니다 ^^

제가 마지막에 드린 질문이 있는데 이 경우는 어떻게 되는지 알 수 있을까요?

결합인덱스와 단일인덱스 여러개, 둘 중에 어떤게 더 퍼포먼스에 좋을까요?

결합인덱스는 순서대로 조회 대상이 걸러져서 더 빠르다고 들었는데,

단일 인덱스로 여러개 만들어서 아래 처럼 컬럼 A,C로 조회하면 

단일 인덱스가 각각 먹히는 건지, 아니면 결합 인덱스 처럼 작동하는건지 궁금합니다

---------------------------------------------------------------------------------------------------

그리고 위와 같은 조건에서 결합인덱스로 컬럼 A, B, C, D 를 만들어서 컬럼 A, C 조건으로 조회하는 것과

단일인덱스로 해서

인덱스 01 : A / 인덱스 02 : B / 인덱스 03 : C / 인덱스 04 : D 를 만들어서 컬럼 A, C 조건으로 조회화는 것 중

어떤 것이 조회 퍼포먼스에 더 좋을까요?

------------------------------------------------------------------------------------------------------


by 마농 [2021.11.22 10:48:33]

단일인덱스가 하나만 선택되어 실행될 수도 있고(가능성 높음)
각각의 단일인덱스를 스캔하여 머지하는 방식이 될 수도 있습니다.(가능성 낮음)
동등조건인지 범위조건인지 등도 따져 봐야 합니다.
여러가지 감안할게 많지만. 일반적으로 결합이 단일보다는 나을 것으로 예상됩니다.


by 미친감자 [2021.11.22 10:52:31]

친절하고 상세한 답변 정말 감사합니다 ^^

좋은 하루 되세요~~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입