쿼리 조인 방법? 0 5 1,404

by 한번사는인생 [SQLServer] [2022.03.30 09:14:01]


A라는 테이블을 key값으로 조회.
A라는 테이블의 작성자 및 수정자의 이름 및 정보를 가져오기 위해서 B라는 테이블을 조인해야 합니다.
a) 
SELECT 
    (SELECT name FROM B WHERE ID = AA.작성자아이디) AS 작성자이름,
    (SELECT email FROM B WHERE ID = AA.작성자아이디) AS 작성자이메일,
    (SELECT name FROM B WHERE ID = AA.수정자아이디) AS 수정자이름,
    (SELECT email FROM B WHERE ID = AA.수정자아이디) AS 수정자이메일
FROM A AS AA WITH (NOLOCK)
WHERE A.KEY = @KEY

b)
SELECT *
FROM A AS AA WITH (NOLOCK)
    INNER JOIN B AS BB WITH (NOLOCK)        // 작성자를 위한 조인
    ON AA.ID = BB.ID
    INNER JOIN B AS BBB WITH (NOLOCK)        // 수정자를 위한 조인
    ON AA.ID = BBB.ID
WHERE A.KEY = @KEY
    
2가지 방법 중, 효율적인 방법은 무엇일까요.
지금은 작성자/수정자만 조회를 하지만, 이게 작성자/수정자/예약자 등등등 점점 늘어날수가 있습니다.
(쿼리는 임의로 작성하게 틀린 부분이 있을수도 있습니다.)

by 마농 [2022.03.30 11:00:18]

보통 조인이 유리합니다.
다량의 자료에서 중복 자료가 많은 경우 서브쿼리 캐싱 효과가 있어서 스칼라서브쿼리가 유리할수도 있습니다.
중복되는 자료가 적다면? 캐싱효과가 없어 오히려 스칼라서브쿼리가 느립니다.
(Oracle 기준 설명. MSSQL 도 서브쿼리 캐싱 기능이 있는지는 모르겠네요.)
a) 스타일은 B 테이블을 4번 사용하고,
b) 스타일은 B 테이블을 2번 사용하네요.
위와 같이 소량의 자료 검색인 경우라면?
서브쿼리 캐싱 효과도 없고, 테이블을 더 많이 사용하는 a) 스타일은 좋지 않습니다.
다만, 워낙 (키로 1건 검색하는?) 소량이라? 큰 성능 차이는 느끼지 못할 듯 하네요.


by 한번사는인생 [2022.03.30 11:06:39]

역시 마농님. 고맙습니다.

SQL에 무지한 웹개발자여서, 항상 도움 많이 받고있습니다.


by 주신돈 [2022.03.31 15:09:29]

a) , b) 두가지 방법도 중요하지만 해당 결과의 차이가 발생할 수 있는 점이 더 중요하다 보여 집니다.

a) A 테이블만큼만 수행 하고, 혹시 B 테이블 중복값 발생시 오류(error)

b) 부분에서도 구지 2번 inner join 할 필요 없이 1번만 하여, 해당 4가지 자료를 그냥 가져 오면 됩니다.


by 마농 [2022.03.31 15:24:32]

성능 관점으로 답변하다 보니. 중요한 것을 놓쳤네요.
성능보다 중요한 것은 결과의 정확성이죠.
이 댓글을 보니 다시 한번 깨닫게 되네요.
질문의 b) 쿼리는 잘못 표기되어 있습니다.
각각의 조인 항목이 aa.ID 로 동일하게 표기 되어 있지만
실제로는 aa.작성자ID 와 aa.수정자ID 로 각각 두개입니다.
따라서 두번 조인하는 것은 맞습니다.
다만, 작성자의 경우는 없을 수는 없지만
수정자는 없을 수도 있으므로 수정자 조인에는 아우터 조인을 해야 하겠네요.


by 돈보 [2022.03.31 15:51:16]

^^ 오늘 처음 가입한 새내기 입니다.

역시 마농님 ^^ 굿~~~

 

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