database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7550 게시물 읽기
No. 7550
조인과 서브쿼리 비교 - NULL값의 인덱스 참조
작성자
지우개
작성일
2008-10-28 01:56ⓒ
2008-10-28 01:57ⓜ
조회수
7,038

일반적인 게시판입니다.


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등을 가져오려면 여러번 서브쿼리를 돌려야해서 아우터 조인이 정석이지 싶은데

제가 놓친부분에 대해서 조언좀 부탁드립니다.

이 글에 대한 댓글이 총 4건 있습니다.

PK -> 당연히 널일 수 없다. 그러면서 외래키이다.

board.member_id 는 null이 가능하다..

 

이럴 경우 똘똘하다면 member_id 가 null이면 member 테이블을 스캔하지 않는것이 맞겠네요 ㅎ;

서브 쿼리 말고 이렇게 해보시면 어떨까요?

 

SELECT B.*, M.name

FROM board AS B LEFT OUTER JOIN member AS M ON B.member_id is not null and B.member_id = M.id

 

이렇게 해도 스캔이 일어나는지 확인 해보세요 =)

신기배(소타)님이 2008-10-28 03:10에 작성한 댓글입니다.

얼핏 테스트할때는 A.member_id IS NOT NULL 로 되는줄 알았는데

자세히 보니 필터를 거치는 스캔을 하네요. :(

지우개님이 2008-10-28 03:56에 작성한 댓글입니다. Edit

LEFT OUTER JOIN 을 하셔서 그렇습니다.


 LEFT OUTER JOIN 을  INNER JOIN 으로 변경하셔서 해보시기 바랍니다.

김병석(byung82)님이 2008-10-28 08:32에 작성한 댓글입니다.

비회원도 글을 쓸 수 있는 게시판인것 같고 목록을 처리하는 쿼리 같네요 ㅎ

inner join하면 비회원이 쓴 글은 안보이게 된다능;

신기배(소타)님이 2008-10-28 09:19에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7553새로 설치 후 스타트가 안되요 [1]
김태규
2008-11-06
6162
7552[급질]postgreSQL 와전 초보입니다. 8.1 -> 8.3 업그레이드 질문좀..
이태영
2008-11-04
6802
7551postgre Sql windows vista 설치 하는 방법 [5]
김정길
2008-10-31
6313
7550조인과 서브쿼리 비교 - NULL값의 인덱스 참조 [4]
지우개
2008-10-28
7038
7549enterprisedb migration studio 어떻게 쓰는거지요?
양희종
2008-10-22
6052
7547view에 PK를 설정할수 있는지 [3]
김병석
2008-10-17
6336
7545DB별로 port를 열수 있나요?? [4]
곤조
2008-10-14
6224
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다