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가지 방법 중, 효율적인 방법은 무엇일까요.
지금은 작성자/수정자만 조회를 하지만, 이게 작성자/수정자/예약자 등등등 점점 늘어날수가 있습니다.
(쿼리는 임의로 작성하게 틀린 부분이 있을수도 있습니다.)
보통 조인이 유리합니다.
다량의 자료에서 중복 자료가 많은 경우 서브쿼리 캐싱 효과가 있어서 스칼라서브쿼리가 유리할수도 있습니다.
중복되는 자료가 적다면? 캐싱효과가 없어 오히려 스칼라서브쿼리가 느립니다.
(Oracle 기준 설명. MSSQL 도 서브쿼리 캐싱 기능이 있는지는 모르겠네요.)
a) 스타일은 B 테이블을 4번 사용하고,
b) 스타일은 B 테이블을 2번 사용하네요.
위와 같이 소량의 자료 검색인 경우라면?
서브쿼리 캐싱 효과도 없고, 테이블을 더 많이 사용하는 a) 스타일은 좋지 않습니다.
다만, 워낙 (키로 1건 검색하는?) 소량이라? 큰 성능 차이는 느끼지 못할 듯 하네요.
역시 마농님. 고맙습니다.
SQL에 무지한 웹개발자여서, 항상 도움 많이 받고있습니다.
a) , b) 두가지 방법도 중요하지만 해당 결과의 차이가 발생할 수 있는 점이 더 중요하다 보여 집니다.
a) A 테이블만큼만 수행 하고, 혹시 B 테이블 중복값 발생시 오류(error)
b) 부분에서도 구지 2번 inner join 할 필요 없이 1번만 하여, 해당 4가지 자료를 그냥 가져 오면 됩니다.
성능 관점으로 답변하다 보니. 중요한 것을 놓쳤네요.
성능보다 중요한 것은 결과의 정확성이죠.
이 댓글을 보니 다시 한번 깨닫게 되네요.
질문의 b) 쿼리는 잘못 표기되어 있습니다.
각각의 조인 항목이 aa.ID 로 동일하게 표기 되어 있지만
실제로는 aa.작성자ID 와 aa.수정자ID 로 각각 두개입니다.
따라서 두번 조인하는 것은 맞습니다.
다만, 작성자의 경우는 없을 수는 없지만
수정자는 없을 수도 있으므로 수정자 조인에는 아우터 조인을 해야 하겠네요.
^^ 오늘 처음 가입한 새내기 입니다.
역시 마농님 ^^ 굿~~~