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 8612 게시물 읽기
No. 8612
driving table 선택..
작성자
백수환(back17)
작성일
2010-01-27 16:32ⓒ
2010-01-27 17:30ⓜ
조회수
7,594

안녕하세요.

아래 쿼리에서 최적의 실행계획은 b테이블을 reg_date 인덱스를 이용해 스캔한뒤 a테이블을 join하면서 조건에 만족하는 10개를 뽑은뒤 stop하는 건데요.

문제는 reg_date의 범위가 어느정도를 넘어가면 무슨짓을  해도 a테이블을 풀스캔하는 hash조인으로 실행됩니다.

eanble_seqscan값을 false로 해도 a테이블의 pk인덱스를 사용해서 읽네요 . a테이블을 먼저 스켄하겠다는 강한 의지가 느껴집니다;;

실제 쿼리는 from절에 테이블이 5개정도 되고 인라인뷰와 스칼라쿼리등 좀 복잡한 쿼리라서 옵티마이저가 잘못판단하는걸로 보이는데요.

이런경우 먼저 스캔하는 테이블을 지정할수 있는 방법이 있나요?

8.3버전이고 통계정보는 갱신되고 있습니다.

조언부탁드립니다.

 

select *

from a, b

where a.idx=b.idx

and a.reg_date between '2010-01-01' and '2010-01-27'

and b.name like '%태희%'

order by reg_date limit 10;

 

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

PostgreSQL에서는 현재 쿼리 최적화 기능에 대해서 사용자가 임의로 선택할 방법이 없습니다.

또한 쿼리가 복잡해질 경우, 사람이 생각하는 것하고 전혀 다르게 최적화기가 작동하기도 합니다.

 

방법은 어떻게든 a.reg_date 인덱스를 사용하게 만드는 방법인데,

a.reg_date 의 범위가 너무 넒어서 인덱스를 사용하는 무의미하다고 최적화기가 인덱스 사용을 포기하는 경우를 막는 방법 뿐입니다.  (물론 a.idx = b.idx 에서 반드시 a.idx 키 인덱스를 사용할 것이다는 보장이 있다면 말입니다)

첫번째 방법은 between 범위를 줄이는 것일터이고,

두번째 방법은 별로 기대는 안되지만, create index 작업을 할 때, where 절을 사용해서

인덱스 크기를 줄여보는 방법도 있지 않을까싶습니다.

뭐, 여튼 구체적인 상황을 모르니, 뭐라고 하기도 그렇지만,

이 부분의 문제는 공짜 RDBMS 사용하는 수고로움이다고 받아드려야하지 않을까싶네요.

부디 잘 피해가는 방법을 찾아보시길. 더 열받으시면 직접 쿼리 최적화기 힌트 기능을 구현해 보시든지.

 

김상기(ioseph)님이 2010-01-27 22:23에 작성한 댓글입니다.

답변 감사합니다.

조건값을 받는 reg_date의 통계정보의 양을 늘려주니까 해결이 되네요 ^_^

아래와 같이 해당컬럼의 statistics target 값을 늘려주고 analyze를 돌려주니 실행계획이 제대로 풀립니다.

디폴트값은 10이구요.

적용하실때 최대값인 1000으로 설정하면 analyze시간이 너무 오래걸리니 테스트하면서 최적의 값을 찾아야 될거 같습니다.

alter table a alter reg_date set statistics 100

백수환(back17)님이 2010-01-28 21:49에 작성한 댓글입니다.
이 댓글은 2010-02-12 14:10에 마지막으로 수정되었습니다.

덕분에 pg_stats 뷰를 꼼꼼하게 보게 되었습니다.

고맙습니다.

글을 한 번 써야겠네요. 꽤나 중요한 이야기가 많네요.

 

김상기(ioseph)님이 2010-01-29 16:51에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
8615특정 테이블에 자료를 입력할때, 테이블을 분리할수 있을까요? [4]
성제호
2010-02-02
9754
8614김상기님께, xe 보드에 postgresql 사용할려고 하는데 에러가... [3]
유기양
2010-02-02
8247
8613ASP에서 커넥션 어떻게 연결하나요? [1]
에소테리아
2010-01-27
8077
8612driving table 선택.. [3]
백수환
2010-01-27
7594
8611임포트 하는 과정에서 UTF-8 문제 [1]
조용환
2010-01-27
7806
8610큐브리드 테이블에 있는 데이타를 임포트 하고 싶습니다. [1]
에소테리아
2010-01-27
8888
8609postmaster 항상 cpu 잡아먹고 있습니다. [2]
월광돼지
2010-01-27
8156
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다