order by 구문을 사용하지 않고 정렬을 하기 위해 index를 이용했습니다.
아래는 제가 테스트한 몇가지 방법과 궁금한 점을 써놓았습니다.
create table test(
name varchar(10)
, constraint pk_test primary key (test)
);
insert into test values ('aaa');
insert into test values ('ccc');
insert into test values ('bbb');
# 얻고자 하는 답은 실행계획에서 Sort 부분이 없이 데이터가 정렬이 되어서 나오는 것입니다.
- 첫번재 방법
explain analyze select * from test where name > '';
"Bitmap Heap Scan on test (cost=7.35..22.35 rows=400 width=38) (actual time=0.031..0.031 rows=3 loops=1)"
" Recheck Cond: ((name)::text > ''::text)"
" -> Bitmap Index Scan on pk_test (cost=0.00..7.25 rows=400 width=0) (actual time=0.023..0.023 rows=3 loops=1)"
" Index Cond: ((name)::text > ''::text)"
"Total runtime: 0.082 ms"
하지만 bitmap index scan이 일어나면서 정렬이 되지 않았습니다.
- 두번째 방법
explain analyze select * from test where name > '' order by name;
"Sort (cost=39.64..40.64 rows=400 width=38) (actual time=0.063..0.064 rows=3 loops=1)"
" Sort Key: name"
" Sort Method: quicksort Memory: 25kB"
" -> Bitmap Heap Scan on test (cost=7.35..22.35 rows=400 width=38) (actual time=0.042..0.043 rows=3 loops=1)"
" Recheck Cond: ((name)::text > ''::text)"
" -> Bitmap Index Scan on pk_test (cost=0.00..7.25 rows=400 width=0) (actual time=0.033..0.033 rows=3 loops=1)"
" Index Cond: ((name)::text > ''::text)"
"Total runtime: 0.112 ms"
이것도 역시 bitmap index scan이 발생했고, quicksort 까지 나타났습니다.
- 세번째 방법
set enable_bitmapscan = off;
set enable_seqscan = off;
explain analyze select * from test where name > '';
"Index Scan using pk_test on test (cost=0.00..51.25 rows=400 width=38) (actual time=0.027..0.030 rows=3 loops=1)"
" Index Cond: ((name)::text > ''::text)"
"Total runtime: 0.066 ms"
이제야 제가 원하는 답이 나왔습니다. cost가 살짝 더 나오긴 했지만 실행시간은 가장 짧았습니다.
여기서 제가 궁금한것은
set enable_bitmapscan = off;
set enable_seqscan = off;
질문 1. 옵션 조정없이 bitmap index scan을 타지않고 index scan으로 실행계획을 변경할 수 있느냐?
질문 2. bitmap index scan과 index scan은 어떻게 다른가?
알고 계시는 분이 있으시다면 알려주세요.
겨우겨우 삽질해가면서 여기까지 왔습니다. |