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 9339 게시물 읽기
No. 9339
Postgresql 9.2 에서 EXPLAIN ANALYZE 수행 시간 관련입니다.
작성자
이야기
작성일
2013-09-12 11:59ⓒ
2013-09-12 12:01ⓜ
조회수
10,886

안녕하세요.

 

 

데이터베이스를 Postgresql 9.2 를 선정하여 퍼포먼스 테스트 중입니다.

 

다름이 아니오라. DB의 퍼포먼스 테스트를 위해

 

약 30만개 데이터를 등록하였습니다. (Mysql 의 load_employees.dump 샘플 DB)

 

테이블은 아래와 같이 hire_date에 인덱스를 걸어준 employees와 걸지 않은 employees2 2개 입니다.

 

 

CREATE TABLE employees

(

emp_no integer NOT NULL,

birth_date date NOT NULL,

first_name character varying(14) NOT NULL,

last_name character varying(16) NOT NULL,

gender character varying(10) NOT NULL,

hire_date date NOT NULL,

CONSTRAINT employees_pkey PRIMARY KEY (emp_no)

)

WITH (

OIDS=FALSE

);

ALTER TABLE employees

OWNER TO postgres;-- Index: hire_data_idx

 

CREATE INDEX hire_date_idx

ON employees

USING btree

(hire_date)

WITH (FILLFACTOR=90);

 

 

CREATE TABLE employees2

(

emp_no integer NOT NULL,

birth_date date NOT NULL,

first_name character varying(14) NOT NULL,

last_name character varying(16) NOT NULL,

gender character varying(10) NOT NULL,

hire_date date NOT NULL,

CONSTRAINT employees2_pkey PRIMARY KEY (emp_no)

)

WITH (

OIDS=FALSE

);

ALTER TABLE employees2

OWNER TO postgres;-- Index: hire_data_idx

 

 

제가 pgAdminIII 를 이용해서 SQL 쿼리를 아래와 같이 수행하면, 281 ms 가 나옵니다.

 

SELECT hire_date FROM employees WHERE "hire_date">'1991-11-09' and "hire_date"<'1992-11-09'

쿼리전체 실행 시간:281 ms.

20627 행을 검색했습니다.

 

 

그리고 인덱스가 없는 employees2 에서는 아래와 같은 결과가 나오고, 343 ms 라고 나옵니다.

 

 

SELECT hire_date FROM employees2 WHERE "hire_date">to_date('1991-11-09', 'YYYY-MM-DD') AND "hire_date"

쿼리전체 실행 시간:343 ms.

20627 행을 검색했습니다.

 

 

처음엔 쿼리 속도차가 별로 안나는 것 같아서 인덱스가 별로 효용이 없나? 하고 생각했었는데

 

EXPLAIN ANALYZE를 이용하면 차이가 두드러 집니다. (31 ms)

 

EXPLAIN ANALYZE SELECT hire_date FROM employees WHERE "hire_date">'1991-11-09' and "hire_date"<'1992-11-09'

쿼리전체 실행 시간:31 ms.

4 행을 검색했습니다.

 

"Index Only Scan using hire_date_idx on employees (cost=0.00..718.87 rows=20729 width=4) (actual time=0.020..5.038 rows=20627 loops=1)"

" Index Cond: ((hire_date > '1991-11-09'::date) AND (hire_date < '1992-11-09'::date))"

" Heap Fetches: 0"

"Total runtime: 5.847 ms"

 

 

EXPLAIN ANALYZE SELECT hire_date FROM employees2 WHERE "hire_date">to_date('1991-11-09', 'YYYY-MM-DD') AND "hire_date"

쿼리전체 실행 시간:328 ms.

4 행을 검색했습니다.

 

"Seq Scan on employees2 (cost=0.00..8242.48 rows=20865 width=4) (actual time=0.129..310.165 rows=20627 loops=1)"

" Filter: ((hire_date > to_date('1991-11-09'::text, 'YYYY-MM-DD'::text)) AND (hire_date < to_date('1992-11-09'::text, 'YYYY-MM-DD'::text)))"

" Rows Removed by Filter: 279397"

"Total runtime: 310.898 ms"

 

 

여쭙고 싶은 내용은 SELECT 에서도 수행 시간이 나오고 EXPLAIN ANALYZE에서도,

또 세부 내용에서도 Total runtime 시간이 나오는데, 시간 기준을 어디로 잡아야 할 지 모르겠습니다.

왜냐하면 SELECT 에서의 시간은 employees와 employees2 간의 시간차가 별로 나지 않고

EXPLAIN ANALYZE 시간과 차이가 너무 납니다.

 

그리고 EXPLAIN ANALYZE 를 통해 나온 결과 항목에서의 Total runtime 시간은 또 다릅니다.

pgAdminIII 에서 SELECT 문에서 나온 시간이 거의 300ms 인데 이것이 리스트로 결과를 디스플레이

하는데 소요되는 시간까지 포함이 되어서 그런 것인지 좀체 기준을 잡지 못하겠습니다.

 

제가 알고 싶은건 실제 쿼리 수행 시간입니다. (인덱스를 가진것과 가지지 않은 것과의 비교를 위함)

 

가르침 부탁 드리겠습니다.

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

 서버 로그를 설정을 환경변수로 

log_min_duration_statement 가 있습니다. 

이게 정확하게 서버에서 쿼리가 실행된 시간 입니다. 

즉 서버측만 고려한다면, 로그로 남기고 그 로그를 보는게 제일 편합니다.

 

psql 에서 \timing 으로 쿼리 수행시간을 볼 수도 있는데, 

이것은 pgAdmin에서 보여주는 것과 같이 사람이 그 쿼리 결과를 보는 시간

서버 시간 + 클라이언트에서 fetch 완료한 시간입니다. 

 

윗 explain에서 보여주는 시간은 그 explain 작업에 소요된 시간입니다. 

 

----

index only scan 과, sequence scan 차이가 별로 없다는 이야기는

아래 다른 분의 글에서도 언급했듯이, 

공우버퍼에 그 자료가 있느냐 없느냐에 따라 달라집니다. 

두 쿼리를 비교하려면, 

서버를 재실행 해서 아에 공유 버퍼에 어떠한 데이터도 없는 상태에서, 

또는 모든 테이블의 자료가 공유 버퍼에 있는 상태에서,

또는 공유 버퍼의 크기를 아주 작게 해서 필요한 것만 그때, 그때 공유버퍼로 불러왔는 

경우등 다양한 경우를 같이 생각해야합니다. 

단순하게, 30만개 자료에 대한 쿼리가 이렇게 하나 저렇게 하나 별반 차이가 없어요. 

보고서 결론으로 수용하기 힘듭니다. 

 

김상기(ioseph)님이 2013-09-12 13:37에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9342전체백업 및 복구시 완전히 동일하게 복구하려면... [3]
김성환
2013-09-16
9901
9341PostgreSQL을 사용하면서 [1]
퓨전마법사
2013-09-15
10280
9340전체백업 및 복원 문의 [2]
김성환
2013-09-13
9917
9339Postgresql 9.2 에서 EXPLAIN ANALYZE 수행 시간 관련입니다. [1]
이야기
2013-09-12
10886
93388.2 버젼과 8.3 버젼에서의 속도차이 테스트중 ^^ 현상질문입니다. ^^ [2]
롱다리
2013-09-11
9440
9337서비스시작이 안되요..? [1]
초보
2013-09-11
15994
9335데이터 저장공간 변경을 하려고 합니다. [2]
iyob
2013-09-06
9929
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다