INNER JOIN table_a a ON a.id = CASE WHEN b.type = '2' THEN b.id END
쿼리를 보다보니 이런 조인 조건이 있는데요
이경우 b.type이 '2' 일 경우에 b.id 로 조인 되는건 알겠는데
아닌경우는 그럼 어떻게 되나요? 조인이 어떻게 되는건지... 이런건 처음봐서 잘모르겠네요
가령 b.type 이 1인 녀석은 조인을 안하게 되는건지...
결과도 결과지만 저런식으로 사용한 의도나 어떤 때 저런식으로 사용하는지도 궁금하고요..
감사합니다.
Comment 5
-
sams
2014.05.08 13:16
아하 감사합니다. 그냥 AND조건에 b.type ='2' 하는거랑 결과는 같겠군요!!! (왜 이렇게 해놨을지 ㅜㅜ)
-
맨즈밤
2014.05.08 13:27
b.type = '2'가 아닐때는 NULL로 만들어 버리니 결국 b.type = '2' 일때만 조인하겠다는 의미이구요.
근데 궁금해서 그러는데 속도는 잘 나오나요? 저렇게 짜놓으면 모든 b테이블의 type컬럼을 모두 뒤져서 2일때는 id, 아닐때는 null로 바꾸는 처리가 들어가게 됩니다. 또한 조인의 연결컬럼중 하나가 가공되니 실행계획도 생각보다 안좋아질수있을거같은데요.
type이 인덱스가 있다고 가정하고, 그냥 ON a.id = b.id 으로 해놓고 WHERE 절에서 b.type = '2' 를 넣어보시면 속도가 어떤지 궁금하네요..
-
sams
2014.05.08 14:07
저도 성능 문제가 있는 쿼리를 튜닝하라고 하기에 보고 있는 중인건데.. case문을 빼고
where 절에 해당 조건을 넣고 바꿔봐도 속도가 개선 되고 있지는 않습니다...
-
맨즈밤
2014.05.08 15:37
실행계획이나 IO수치등을 보면서 분석하셔야 튜닝이 될텐데요. 혹시 그부분이 어려우시면 일단 관련 테이블들의 인덱스리빌드, 통계업데이트등이라도 수행해주시면 될듯합니다.
CASE WHEN b.type = '2' THEN b.id END
b.type이 2가 아니면 NULL을 반환하겠죠?
그러면 INNER JOIN table_a a ON a.id = NULL이 되겠네요.