결합인덱스 필드 추가 0 6 1,123

by 김종석 [2017.07.19 22:52:30]


어떤 테이블에 A필드 와 B필드 로 이루어진 유니크 인덱스를 만들었습니다.  

 문제는 또다른 C필드가 조건에 많이 사용되는데 ,랜덤액세스를 막기위해 C필 드까지 인덱스 혹은 PK를 잡는게 옳은건가요? 

혹시 A,B,C로생성하면 하면 A,B필드만을 이용한 조인시, STOP 이 안걸려서 비효율이 발생하지 않을까요? 

 

감사합니다. 

 

by jkson [2017.07.20 08:19:04]

c필드로 인한 랜덤액세스 부하가 심하다면 c를 추가하시는 게 좋을듯하네요.

a, b필드만 사용하여 조인한다면 c필드 탐색은 하지 않을 것인데..

말씀하신 stop이 안 걸리는 상황이 어떤 건지, 왜 그런 생각을 하신 건지 궁금하네요.

다만, b필드의 값의 종류가 많지 않고 c필드가 값의 종류가 많은 컬럼이라면

a,b만으로 구성되었을 때의 클러스터링팩터보다 a,b,c로 구성했을 때의 클러스터링팩터가

나빠져서 똑같은 쿼리에서 IO가 더 커질 수는 있겠네요.

 

 


by 마농 [2017.07.20 08:34:09]

a,b,c 로 유니크인덱스를 만든다면?
a,b,c 를 모두 사용하는 조회 쿼리의 성능은 좋아집니다.
다만 원래의 의도인 a,b 유니크 제약이 사라지게 됩니다.
a,b,c 까지 유니크로 잡하기 때문이죠.

인덱스도 생성하고 유니크 제약도 함께 하려면?
a,b,c 일반 인덱스를 만들고(유니크 인덱스로 만들어도 상관 없을 듯.)
a,b 유니크 제약만 따로 만드시면 됩니다.

a,b 만 조건을 준다면?
기존 a,b 유니크 인덱스가 있을 때 보다는 비효율이 존재합니다.
인덱스도 유니크에서 일반으로 바뀌었고, c가 포함되어 인덱스 크기도 커졌죠.
하지만 성능에 엄청난 영향을 미치지는 않을 것으로 예상합니다.
또한 a,b,c 로 검색시엔 확실한 성능개선이 있습니다.


by jkson [2017.07.20 08:41:38]

마농님~ 만약 말씀하신대로 c필드가 추가되면 인덱스 크기가 커진다는 단점은 알겠는데

유니크 인덱스에서 일반 인덱스로 바뀌었을 때의 단점은 언듯 잘 이해가 안 되는데요.

어떤 말씀이신지 여쭤봐도 될까요?


by 마농 [2017.07.20 08:48:18]

유니크 일때는 1건만 읽고 멈출듯 한데(Unique Scan)
유니크 아닐 때는 1건 더 읽고 멈출듯.(Range Scan)


by jkson [2017.07.20 09:20:23]

아~ 작성하신 분도 그 이야기를 하신 거군요?

저는 당연히 a,b에 유니크 제약이 필요하면 유니크 제약 걸고

인덱스에는 c 추가하는 형태로 생각했어요.

a, b, c로 유니크인덱스 만든다면 a, b가 중복되는 상황이 생길 수도 있으니까요.

현실적으로 a, b가 중복되는 일이 생길 수 없는 구조라면

a, b, c 유니크 인덱스로 만들어도 크게 상관은 없겠지만..


by 김종석 [2017.07.20 12:17:21]

마농님 jkson님 감사합니다. 더위 조심하세요. 

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