안녕하세요
그간 별고 없이 postgres를 쓰다가 방금 어이없는 현상을 보고 질문 드리러 날아왔습니다 ^^;
테이블은 게시판입니다.
CREATE TABLE "tb_board" (
"no" integer NOT NULL default nextval('seq_board_no'),
"b_id" integer NOT NULL references tb_board_title(b_id) match full on delete cascade on update cascade,
"num" integer NOT NULL,
"replyseq" varchar(10) DEFAULT 0 NOT NULL,
primary key(no)
);
위와 같이 테이블의 목록을 저장하는 테이블이 있고요. 물론 쓸데없는 필드는 적지 않았습니다.
CREATE TABLE "tb_board_detail" (
"no" integer NOT NULL references tb_board(no) on delete cascade on update cascade,
"dsc" text,
primary key(no)
);
게시물의 내용만 따로 저장하고 있습니다.
문제는요 tb_board 에 생성한 인덱스에서 발생했습니다.
CREATE INDEX board_no_index on tb_board using btree ("b_id", "num", "replyseq");
이와 같이 인덱스를 생성했고
b_id 는 게시판의 ID이며 num은 부모게시물의 값이고 모든 게시물에 들어가며 중복될수 있습니다. 답글이 있을시에는 replyseq 를 통해 정렬하는데
num 은 큰수부터 작은수로 저장됩니다. (시퀀스를 만들때 큰수부터 시작해서 -1씩 증가되게 했습니다) replyseq는 원글은 0 이고 답글이 아래로 달릴수록 증가되는 방식이고요
그럼 저런 인덱스가 있다면
select * from tb_board where b_id='게시판ID'
라고만 하면 이론적으로는 num과 replyseq 가 작은수 -> 큰수 대로 자동 정렬이 되어 나와야 합니다 order by 를 쓰지 않아도.
문제는 잘 되던게.. vacuum 을 한번 하고 나면 꼭 인덱스가 잘못됐는지 인덱스를 쓰지 않습니다 =_=;
테이블을 처음부터 다시 만들기 전에는 끝까지 인덱스를 쓰지 않네요.
vacuum 전
Limit
-> Index Scan using board_no_index on tb_board
vacuum 후
Limit
-> Seq Scan on tb_board
이렇게 되어버립니다 =_=;
게시물 정렬은 안되버리고요
vacuum 을 사용할때는 어떤 주의사항같은것이 있는지요
답변 부탁드립니다~ ^^;
|