IT Diary/# SQL

[ SQL ] 004. INDEX가 동작을 제대로 안하는 경우 #2

셜록호움즈 2023. 1. 11. 22:45
728x90
반응형

 

 

3. 결합인덱스 사용 시, 인덱스 구성의 첫인덱스가 where절의 첫 조건에 적용하지 않았을 경우

 

두 개 이상의 컬럼을 합쳐서 인덱스를 만들 때 결합인덱스라고 한다. 

결합인덱스 컬럼 선택의 기준점은

  1. where 절에서 and 조건으로 자주 사용되며, 각각 사용할때보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼
    ※ 분포도(Cardinality) : 해당 컬럼의 중복도가 적을 경우 분포도가 높고, 중복도가 높을경우 분포도가 낮다
    흔히, 우리가 Table의 ID 는 중복되는 값이 없으므로 분포도가 높다고 할 수 있고, Name 같은 컬럼은 ID에 비해 중복되는 값이 많으므로 분포도가 높다고 할 수 있다. 
  2. 테이블 조인을 위한 연결고리로 사용되는게 빈번한 컬럼
  3. 자주 정렬되는 컬럼인지 고려
  4. 쿼리 작성시 '=' 으로 지정할 수 있는 컬럼이 선행되어야 한다. 
index를 구성할 때, A,B,C 로 구성한다고 했을 때

#첫번째 케이스
select *
  from test
 where A=99
   and B=99
   and C=99;
   
#두번째 케이스
select *
  from test
 where A=99
   and B between 10 and 99
   and C=99;
   
#세번째 케이스
select *
  from test
 where A between 10 and 99
   and B between 10 and 99
   and C=99;


첫번째, 두번째 케이스는 인덱스를 타지만, 세번째 케이스는 인덱스를 타지 않는다.

물론 두번째 케이스도 완벽하게 인덱스를 타는건 아니다. 실행계획을 떠보면 알겠지만 범위 조건은 해당 컬럼은 인덱스를 타지만, 그 뒤 인덱스 컬럼들은 인덱스를 타지 않고 filter access를 하게 된다. (https://khdscor.tistory.com/51)

쿼리 툴에서는  force index를 통해 강제로 힌트를 줄 수 있지만 ,JPA/Hibernate에서는 Query Hint 조정이 불가능
실제로 JPA/Hibernate에서의 힌트는 Hibernate의 작동 방식에 대한 Hint이지 Query Hint가 아니다.

728x90
반응형

'IT Diary > # SQL' 카테고리의 다른 글

[ SQL ] 003. INDEX가 동작을 제대로 안하는 경우 #1  (0) 2023.01.04
[ SQL ] 003. 실행계획 보는법  (0) 2022.04.18
[ SQL ] 001. INDEX 의 정의  (0) 2021.03.17
[ SQL ] 002. INDEX SCAN  (0) 2021.03.16