안녕하세요.
데이터베이스를 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 인데 이것이 리스트로 결과를 디스플레이
하는데 소요되는 시간까지 포함이 되어서 그런 것인지 좀체 기준을 잡지 못하겠습니다.
제가 알고 싶은건 실제 쿼리 수행 시간입니다. (인덱스를 가진것과 가지지 않은 것과의 비교를 위함)
가르침 부탁 드리겠습니다.
|