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 9016 게시물 읽기
No. 9016
실행계획 관련하여 문의드립니다.
작성자
김혁민(goodesskr)
작성일
2012-08-09 13:42ⓒ
2012-08-09 16:33ⓜ
조회수
11,680

안녕하세여.

PostgreSQL 공부하고 있는 중입니다.

실행 계획 관련하여 궁금한 점이 있어 문의드립니다. 도움을 주시면 감사드리겠습니다.

 

테이블 생성

create table test2

      (a int, b int, c varchar(10),

      constraint test2_pk primary key(a,b)

      );

 

실행계획

explain
select a,b,c from test2
where a= 1 and b= 1;

 

결과값

"Index Scan using test2_pk on test2  (cost=0.00..8.27 rows=1 width=46)"
"  Index Cond: ((a = 1) AND (b = 1))"

 

위의 실행 계획을 보면 조건절에 결합인덱스(a,b)를 사용하여 인덱스 스캔을 하고있습니다. 여기서 a,b,c 컬럼을 select 문 뒤에 추가를 하였습니다.  제 개인적인 생각상으로는 인덱스 스캔 후 Table Scan을 통하여 C 컬럼의 값을 가져와야 한다고 생각하는데 PostgreSQL 실행 계획에서는 보이지 않습니다. 이 부분이 생략되어서 제대로 안보이는 건지 궁금하여 문의드립니다.

 ---------------------------------------------------------------------------

아래 부분은 오라클의 실행계획입니다.

16:07:20 09-AUG-12 SYS orcl>set autotrace trace

16:07:20 09-AUG-12 SYS orcl>select a,b,c from test2 where a=1 and b=1;


Execution Plan
----------------------------------------------------------
Plan hash value: 1272645620

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |     1 |    33 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST2    |     1 |    33 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | TEST2_PK |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------------

   2 - access("A"=1 AND "B"=1)
 

 ------------------------------------------------------------------------

그리고 http://blog.kimiensoftware.com/2011/04/top-10-missing-postgresql-features-208 해당 링크에서 2. Index Only Scans라는 부분이 있습니다.

2번의 내용이 조회시 Index 에 포함된 컬럼만 조회하는 경우에 오라클은 Index Scan 만 실행하고 결과를 Return 하지만 PostgreSQL의 경우는 Index Scan 후 테이블을 반드시 조회하고 그 결과를 Return 한다. 오라클에서 튜닝시 때때로 Index 에 컬럼을 여러개 포함하여 결합인덱스를 구성하고 Index 만 읽도록 유도하기도 하는데, 이런 스킬을 사용할 수 없다.

링크의 2번의 내용을 위와 같이 풀이가 가능한지 궁금합니다.

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

 PostgreSQL에서는 인덱스만 읽어서 자료를 출력하는 기능이 아직 없습니다. 

9.2에서 지원하겠다는 이야기를 읽은 듯하네요. 

그래서, 윗 실행계획을 읽는다면, 

인덱스를 사용해서 데이터 파일에서 읽을 블럭 주소를 찾고, 

데이터 파일의 한 페이지(블럭)를 읽는구나라고 생각하시면 됩니다. 

 

 

 

김상기(ioseph)님이 2012-08-09 18:05에 작성한 댓글입니다.

아..아직까지 지원이 안되는건가 보군요.

넵 답변 감사드립니다 !!!!!!!!!

오늘도 즐거운 하루 되세여 !!

김혁민(goodesskr)님이 2012-08-10 09:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9019프로시저에서 Delete 시, 실행 행 수 제한 [1]
ziac
2012-08-24
9566
9018postgresql 9.1 실행시 오류 [1]
김인수
2012-08-21
10272
9017윈도우 7 DB에서 "클라이언트 연결에서 예상치 않은 EOF 발견됨" [1]
이인규
2012-08-16
10746
9016실행계획 관련하여 문의드립니다. [2]
김혁민
2012-08-09
11680
9015login 트리거 생성 방법 질문 [2]
노진광
2012-08-07
10476
9014설치할때 CPU 코어수 사용 제약이 가능할까요? [1]
지형준
2012-08-06
9544
9013문자셋 관련 문의 드립니다. [1]
박병훈
2012-08-04
9173
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다