조인시에 조합키 인덱스가 필요하나요? 0 5 2,758

by 프레슬리 [Oracle Tuning] index pk fk [2018.02.24 15:18:21]


 

1.  아래의 테이블 구조를 먼저 보시구요. (대략적으로만 보시면 될거 같아요)

CREATE TABLE T_MSTR_TEST
{
   C1    VARCHAR2(10) NOT NULL;
   C2    VARCHAR2(10) NOT NULL;
   C3    VARCHAR2(10) NOT NULL;
   C4    VARCHAR2(10) NOT NULL;

   C5    VARCHAR2(10)  NULL;
   C6    VARCHAR2(10)  NULL;
}
ALTER TABLE TABLE T_MSTR_TEST
  ADD CONSTRAINT PK_T_MSTR_TEST PRIMARY KEY(C1, C2, C3, C4);

CREATE TABLE T_SUB_TEST
{
   C1    VARCHAR2(10) NOT NULL; 
   C2    VARCHAR2(10) NOT NULL;
   C3    VARCHAR2(10) NOT NULL;
   C4    VARCHAR2(10) NOT NULL;
   C5    VARCHAR2(10) NOT NULL;

   C6    VARCHAR2(10)  NULL;
   C7    VARCHAR2(10)  NULL;
}

ALTER TABLE TABLE T_SUB_TEST
  ADD CONSTRAINT PK_T_SUB_TEST PRIMARY KEY(C1, C2, C3, C4, C5);
ALTER TABLE TABLE T_SUB_TEST
  ADD CONSTRAINT FK_T_SUB_TEST FOREIGN KEY(C1, C2, C3, C4,) REFERENCE T_MSTR_TEST (C1, C2, C3, C4);

위의 내용을 정리하자면, T_MSTR_TEST 테이블은 PK(C1, C2, C3, C4)이고, TABLE T_SUB_TEST 테이블은 PK (C1,C2,C3,C4,C5),

FK(C1,C2C3,C4)의 조합키인데요, 두 테이블 조인 및 성능 측면에서 질문입니다.

 

가. T_SUB_TEST 테이블에서, 조인시에 왜래키인덱스가 없을 때 인덱싱이 적용되나요?

   - PK가 FK컬럼들을 포함(순서 동일함)하고 있어서 PK인덱시를 사용하므로 FK인덱싱이 필요없는건가요?

나. T_SUB_TEST 테이블에서, 외래키 인덱스 생성이 필요한가요? (필요하다면 UNIQUE, NON-UNIQUE 어느것 사용)

다. 일반적으로, 조인시 WHERE절 조인에 PK컬럼 중 일부만 또는 전부를 걸었을 경우에 인덱싱을 타는지가 달라지나요? 

좀 상세하게 답변 부닥드립니다. 감사합니다.

by 임상준 [2018.02.26 08:39:43]

가, 나 - 1,2,3,4 컬럼을 pk index 가 포함하고 있기 때문에 fk 인덱스가 별도로 필요하지는 않을 것 같습니다.

다. NL 조인일 경우 조건이나 조인절에 PK 선두컬럼을 포함하는지, 후순위 컬럼만을 사용하는지 등에 따라 다릅니다. 일부/전부로 나누기에는 좀 더 다양한 상황이 있을 수 있습니다.


by 우리집아찌 [2018.02.26 09:24:50]

실제로 FK는 잘 쓰이지않습니다.

써본적이 없어서 큰 답변은 힘드네요.

다. 경우에 따라서 다릅니다.

- 일반적으로 인덱스의 선두컬럼이 조건에 존재해야 INDEX를 잘 이용합니다. ( 데이터에 따라 후행컬럼만 존재해도 탈수 있습니다. )

- 하지만 PK 컬럼이 전부 있어도 옵티마이져가 FULL SCAN이 유리하다고 판단되면 FULL SCAN 타죠..

 

 


by playlyun [2018.03.02 09:03:55]

으음?.

FK생성한다고 인덱스가 생기나요?

DB마다 다른가요?


by 마농 [2018.03.02 09:43:25]

가. pk 에 fk 가 모두 포함되므로 PK 인덱스 이용가능합니다.
나. "가"의 이유로 별도 인덱스 생성 필요 없습니다.
다. 일부만 조건 주어도 인덱스 이용 가능합니다.
주의 : "다"의 답변 중 "이용 가능합니다"를 "이용 합니다"로 읽지 마세요.


by 프레슬리 [2018.03.04 10:23:56]

네, 상세한 답변 주셔서 감사합니다.

 

이런 정보공유 및 가이딩이 있어서 참 좋네요.

더욱 활성화될 수 있도록 참여 열심히 할게요.^^

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