안녕하세여.
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번의 내용을 위와 같이 풀이가 가능한지 궁금합니다. |