일반적인 게시판입니다.
CREATE TABLE board (
id SERIAL, -- pk
title varchar(255),
member_id varchar(32), --fk on member.id
name varchar(32)
)
CREATE TABLE member (
id varchar(32), -- pk
name varchar(32)
)
이렇게 테이블이 있고 board.member_id 는 member.id 로 외례키가 되어있습니다.
제가 생각하기에는
SELECT B.*, M.name
FROM board AS B LEFT OUTER JOIN member AS M ON B.member_id = M.id
하면 board.member_id 가 null 이면 member 테이블을 읽지않는것이 맞을거 같은데 실행계획보면 member 테이블을 읽네요.
그래서 일단 아래와 같은 서브쿼리로 했습니다.
SELECT B.*,
CASE WHEN B.member_id IS NOT NULL
THEN (SELECT name FROM member WHERE id = B.member_id)
ELSE B.name
END AS name
FROM board AS B
이렇게 하니 필요한경우(board.member_id 가 null 인경우)만 member 테이블에 인덱스 스캔하여 값을 가져옵니다.
제가 생각하기에는 이경우 outer join 도 비슷한 실행계획에 cost 가 나와야하는데 막상 그렇지 않으니 궁금합니다.
제가 잘못 생각하고 있는것인가요?
아니면 통계정보가 작아(데이타가 작아) cost가 비슷해 (대충) 실행하는걸까요?
일단은 서브쿼리로 잡고있는데 name 뿐만 아니라 email , signature등을 가져오려면 여러번 서브쿼리를 돌려야해서 아우터 조인이 정석이지 싶은데
제가 놓친부분에 대해서 조언좀 부탁드립니다.
|