서브쿼리의 인덱스 태우기 0 10 2,316

by poodle [SQL Query] 튜닝 서브쿼리 union [2017.07.07 13:33:05]


안녕하세요~ 매번 답변에 감사드려요

쿼리를 수정하다 풀리지 않는 부분이 생겨서 질문 드립니다.

아래와 같이 ST1테이블과 ST2테이블을 조인해서 T1의 AA코드와 같은 코드명을 가지고 와야 하는데요

서브쿼리 ST1을 조회를 하니 FULL SCAN을 하더라구요

ST1에 데이터량이 많아  AA컬럼이 PK여서 INDEX UNIQUE SCAN을 하고 싶은데 잘 안되서요

ST2도 마찬가지구요 방법이 없을까요?

그리고 한가지 더 37000건을 조회 하는데 5초가 걸려요 정렬한것 때문에 그런데

해결할 수 있는 방법이 있을까요?          

코드가 징그럽게 많네요;;;    
SELECT A,B,C,T2.A코드명, T3.B코드명, T4.C코드명 FROM T1
LEFT OUTER JOIN T2 ON T1.A코드=T2.A코드
LEFT OUTER JOIN T3 ON T1.B코드=T3.B코드
LEFT OUTER JOIN (SELECT C코드, 코드명 FROM ST1
                 UNION
                 SELECT C코드, 코드명 FROM ST2) T4 ON T1.C코드=T4.C코드

ORDER BY T1.A DESC , T1.B, T1.C

by jkson [2017.07.07 13:59:00]

적당한 index가 있다면 따로 index 사용할 것 같은데..

fullscan이 유리한 상황은 아닌지..

조인은 nested loop로 되나요 hash로 되나요?

 


by poodle [2017.07.07 14:51:02]

1. st1테이블을 full scan하기에는 데이터량이 좀 많아서요 ;; 아무래도 unique scan이 빠를거 같다는 느낌에서 질문 드렸어요 

2. hash로 되요


by jkson [2017.07.07 15:06:36]

혹시나 옵티마이저가 잘못 판단해서 nested loop면서 fullscan하나 했는데 그건 아니네요.

hash일 경우에 fullscan은 크게 상관 없을 것 같은데..

전체 실행계획 올려주시면 전문가분께서 답변을 드릴 것 같네요.(저는 지식이 미천하여..^^;)


by poodle [2017.07.07 16:00:15]

아닙니다 열심히 알려주시려고 하시는데 많이많이 감사드려요!!


by 마농 [2017.07.07 14:11:09]

1. 왜? union all 이 아닌 union 을 사용했는지?
  - 보통 union 은 잘 안씁니다.
2. st1 과 st2 의 관계가 어찌 되는지?
  - 둘중 한쪽에만 자료가 존재하는지?
  - 양쪽 다 자료가 존재 할 수 있는지?
3. Select 항목을 모호하게 표현했는데..
  - 조인된 t2, t3 의 항목 조회는 정말 없는건지? 불필요한 조인은 아닌지?
4. 아우터 조인 일색인데.
  - 정말 아우터 조인이 필요한건지?


by poodle [2017.07.07 14:51:12]

1. T1을 제외한 테이블이 다 코드성 테이블입니다.

코드가 중복이 되어 들어가 있을수도 있고 없을 수도 있어 union을 썼습니다.

2. st1과 st2도 코드성 테이블들입니다.

양쪽에 같은 데이터가 존재할 수도 있고 한쪽에만 존재 할 수 있습니다.

3. t2와 t3도 코드 성이라서요 코드명을 가지고 옵니다.

4. T1이 메인이라 코드명이 존재하지 않아도 메인데이터는 가지고 와야 합니다.


by 마농 [2017.07.07 15:48:03]

st1 과 st2 에 같은 코드 에 대해 다른 코드명 를 가질 수 있나요?


by poodle [2017.07.07 15:53:08]

아니요


by 마농 [2017.07.07 15:54:40]

그렇다면 유니온 하지 마시고
각각 아우터 조인한후에
Select 절에서 NVL 처리 하시면 됩니다.

SELECT T1.A, T1.B, T1.C
     , T2.A코드명
     , T3.B코드명
     , NVL(ST1.C코드명, ST2.C코드명) C코드명
  FROM T1
  LEFT OUTER JOIN T2  ON T1.A코드 = T2.A코드
  LEFT OUTER JOIN T3  ON T1.B코드 = T3.B코드
  LEFT OUTER JOIN ST1 ON T1.C코드 = ST1.C코드
  LEFT OUTER JOIN ST2 ON T1.C코드 = ST2.C코드
 ORDER BY T1.A DESC, T1.B, T1.C
;

 


by poodle [2017.07.07 16:27:24]

아.... 상상도 못했네요...

답변 너무너무 감사드려요

모두모두 오늘도 좋은하루 보내세요~~~

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