fk의 인덱스 설정에 대한 질문 드립니다 0 5 3,849

by 느낌표 fk 인덱스 [2014.09.19 16:41:10]


인덱스 관련 질문 드립니다

예를 들어 emp 테이블과 dept 테이블을 조인한다고 하였을때

연결고리는 emp.deptno = dept.deptno 로 되는데

이때 deptno 는 각각 emp 테이블은 fk, dept 테이블은 pk 로 잡혀있습니다

scott 계정의 샘플에서는 위와 같이 잡혀있는데

조인이되는 연결고리는 서로 인덱스로 잡혀있는 것이 좋다고 들었습니다

실무에서는 어떤식으로 하시는지 알고 싶습니다 연결고리가 되는 fk 컬럼을 인덱스를 주는것이 맞는지요?

그리고 주는 것이 맞다면 왜 scott계정은 왜 fk에 인덱스지정을 해놓지 않았는지도 궁금합니다

 

by DJ [2014.09.19 17:27:24]

1. 제가 아는 지식으로는 실무에서는 데이타의 정합성이 아주 중요한 Parent-Child 관계인 경우에만 FK 사용 권장하고요, 그렇지 않으면, FK 사용 권장 하지 않습니다.

(참고로 제가 일하고 있는 모쇼핑몰 site는 FK 사용하지 않습니다. - 데이터 정합성도 중요하지만, 더중요한 것은 성능이죠. 그리고 FK때문에 update시 Lock 이라도 걸리면 큰일이죠.)

2. 연결고리가 되는 부분은 가능하면 Index 있어야 되겠습니다. Index 가 없으면, Oracle Optimizer가 선택할 수 있는 것은 해당 table 의 full scan 뿐이겠죠.

3. >>주는 것이 맞다면 왜 scott계정은 왜 fk에 인덱스지정을 해놓지 않았는지도 궁금합니다

제 생각에는 건수가 얼마 없어서 아닐까요. 건수가 얼마 없다면 Index가 잡혀 있어도 타지 않을 가능성 있습니다.


by 아발란체 [2014.09.19 17:38:46]

PK은 인덱스가 자동 생성되는데 반해 FK 항목은 인덱스 별도 주셔야 합니다.

또한 FK 항목에 인덱스 줘도 타지 않는다면 DJ님 말씀처럼 옵티마이저가 풀스캔이 유리하다고 판단해서 그런 것 같습니다.

그런 경우 힌트를 지정하면 될 것 같습니다.

근데 이런 경우 플랜을 확인해보세요, COST를 보면 힌트로 지정한 것이 수치가 더 높게 나올 수 있습니다.

또한 NULL이 들어있어도 인덱스를 타지 않을 수 있습니다.


by 느낌표 [2014.09.19 19:26:52]

답변 감사드립니다

한가지만 더 질문 드리겠습니다

개발된 DB 중에서 보면 FK를 사용하지 않고 PK로 올려 복합키로 생성하는 경우가 있던데

dept, emp 테이블로 예를 들면 dept(pk:deptno), emp(pk:deptno, empno) 이런식입니다

비교가 dept 와 emp 테이블이라 이상합니다만...

보통의 경우 이렇게 올려서 하는지

아니면 원래의 emp, dept 테이블처럼 dept(pk:deptno), emp(pk:empno)  이렇게만 하고 FK를 잡

지 않고 emp.deptno에 인덱스만 주어서 실무에서 쓰는지 궁금합니다

감사합니다


by 아발란체 [2014.09.20 00:37:19]

상황에 따라 다릅니다.

말씀하신 기준으로 결정 할 수 없습니다.

 

기본적으로 주식별자는 대표성을 가져야 하고 고유 식별이 되어야 하며 이를 단일 속성으로 이를 보장 할 수 없다면 복합 속성을 검토해야 합니다. 또한 이를 보장하더라도 주로 조회 방법이 대부분 복합키로 접근한다면 이를 기본키로 대표성을 가지 수 있는지도 고려 할 수 있습니다.

 


by 느낌표 [2014.09.21 20:23:18]

답변 감사드립니다^^

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