음...
조인에서 어떤 쿼리가 가장 좋은건지 잘 모르겠어서 글 남겨봅니다.
w,x,y,z는 그냥 컬럼에 대한 어떤 조건을 표현한겁니다.
예시를 4가지 들어보겠습니다.
많은 조언 부탁드립니다.
1)
SELECT *
FROM T1 a
INNER JOIN T2 b
ON a.id = b.id
WHERE a.col1 = www and a.col2 = xxx and b.col1 = yyy and b.col2 = zzz
2)
SELECT *
FROM T1 a
INNER JOIN T2 b
ON a.id = b.id and a.col1 = www and a.col2 = xxx and b.col1 = yyy and b.col2 = zzz
3)
SELECT *
FROM (SELECT *
FROM T1
WHERE a.col1 = www and a.col2 = xxx) a
INNER JOIN (SELECT *
FROM T2
WHERE b.col1 = yyy and b.col2 = zzz) b
ON a.id = b.id
4)
SELECT *
INTO #tmp1
FROM T1
WHERE a.col1 = www and a.col2 = xxx
SELECT *
INTO #tmp2
FROM T2
WHERE b.col1 = yyy and b.col2 = zzz
SELECT *
FROM #tmp1 a
INNER JOIN #tmp2 b
ON a.id = b.id
Comment 4
-
맨즈밤
2013.07.12 16:24
-
블랙조
2013.07.12 17:04
단지 작성하신 쿼리 자체로만 봤을때는 결과 자체는 모두 동일할거 같고 저는 임시테이블을 사용하는 4번은 먼저 제외하고
1, 2, 3번 3개는 실행계획이 모두 동일하게 나옵니다. 3 번과 4번 실행계획을 비교해봤을때 4번이 비용이 좀 높게 나오는 편이고
윗분이 말하신 경우가 아닌 올리신 경우로만 본다면 임시테이블(결국 tempdb)을 사용했을때 아주 약간의 비효율이 나올 듯 싶네요.
1, 2, 3번중에는 저 또한 1번 선택합니다.
저같은 경우 눈으로 봤을때도 코딩량이 적고 또한 가독성도 좋아보이며, 또한 먼저 where 조건절이 Access 범위를 줄여준다던지 또는
필터조건으로 쓰인다던지 등등을 보다 명확히 알아볼 수 있어서 저 같은 경우에는 1, 2, 3 번 모두 실행계획 동일하고 동일한 성능에,
결과도 동일하다면 1번으로 작성합니다. 또한 조인조건절과 whare조건절이 확실히 구분되는게 좋아보여서...
말하다 보니 좀 헷갈리네요...ㅡ.,ㅡ
-
화성에서왔어요
2013.07.12 17:28
답변 감사합니다.
그렇다면 4번은 임시테이블이니 논외로 하고,
1,2,3번은 같은 로직이므로 같은 결과가 나오는 것이군요.
제가 샘플 4개를 준비한 이유는,
1-2번은 on과 where의 차이가 궁금했기 때문이고, (결론은 가독성 차이군요^^:)
1-3번은 조건에 따라 셀렉 후 조인하는 것과, 조인하며 조건을 주는 것이 성능차이가 있지 않나 라는 생각을 했기때문입니다.
3-4번은 3번은 복잡하니 성능차이가 크게 나지 않으면 4번도 나쁘지 않다 라는 생각에서 적어본 것이구요.
결론은 1,2,3의 속도가 같고, 가독성에 따라 선택하지만 가독성은 1번이 제일 나은것 같네요.
-
alima
2013.07.17 11:01
우와 저랑 똑같은 생각을 하신분이 있네요 저도 이거 무척 궁금 했었는데 질문자, 답변자 모두 감사드립니다 ^^
문법을 말씀하시는거라면 1번과같은 ANSI SQL을 쓰시길 추천합니다. 성능이라면..에...
사용자가 짠 쿼리를 SQL 옵티마이저는 스스로 최적화 합니다. 고로 1,2,3은 같은 실행계획과 성능이 나올듯하고 , 4번은 성능면에서 떨어질것으로 예상되네요.
특히 4번의 경우 T1 이나 T2 한쪽은 조건의 선택도가 좋고, 나머지 조건은 선택도가 나쁘다면 아주 성능이 떨어질것으로 보입니다.
하지만 항상 4번과같은 경우가 나쁘다는건 아니고, 대량의 집계나 중간처리가 중간중간 들어간경우 , 쿼리 자체가 복잡해서 실행계획이
복잡하게 풀릴경우 4번처럼해서 성능이 해결되는 경우도 있습니다.