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 5123 게시물 읽기
No. 5123
serial 과 index (두가지질문)
작성자
초보
작성일
2003-12-27 05:51
조회수
3,364

두가지 질문을 드리겠습니다.

 

먼저 serial type 에 대해서인데요..

 

제가 우연히 알게 된 것인데

테이블생성시 컬림이 serial 타입으로 하면 시퀸스가 만들이집니다.

그런데 테이블생성시 그냥 serial 로 하고 \d 로 보면

분명 integer 로 나타납니다.

그리고 만들어진 시퀀시를 보면

bigint 로 되어 있고 maxvalue 가 엄청난 숫자로 되어 있습니다.

setval 로 lastvalue 를 2147483646 으로 하고

nextval 을 해보면 다음 숫자가 1 이 증가 되어 있고,

또 nextval 을 하면 int 형의 크기를 넘어섰다고 에러를 냅니다.

지정된 시리얼타입을 int 이상의 bigint 로 쓸려면 어떻게 해야 하는지요

만일 그렇게 할 수 없다면 maxvalue 의 터무니없는값은 어떻게 된 것인지....

예전에 7.2 이전부젼이었나..그때는 maxvalue 가 21억이었떤거 같습니다.

 

두번ㅉ 질문인데요

index 에 관한 질문입니다.

index type(?) 이

hash, btree, rtree, gist 등이 있는데

btree 로 지정할 경우 해당 컬럼이 text 길이가 제한이 되는거 같습니다.

여러가지 속도 테스트를 하다가

데이타 입력중에 게시판본문 내용이 10k 이상인 것이 있는데

이 컬럼이 btree index 로 잡혀 있습니다.

이 데이타를 넣으니 2173 인가.. 암튼 그길이보다 크다면서 데이타 입력이 되질 않고 에러를 내더군요

(본문에 검색을 위한 index 를 걸고 - 그럴필요는 없었으나, 테이블 구성을 이래저래 바꿔가면서

속도텍스트를 하느라.. - 데이타를 넣어봤습니다.)

 

이 길이제한을 해결할수 있는 index 방식은 어떤것이 있으며, 이 다른 index 방식과 btree 방식의 속도차이는 어떤지요.

(index type 은 일반 게시판처럼 검색이 가능해야 합니다. (xxx ~~ 'x' 또는 xxx like 'xx%')

 

 

 

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

bigserial 이라는 형식이 있습니다. 8바이트 int 형식의 시리얼입니다.

최대값은 9223372036854775807 이군요 -_-;

 

두번째 질문은 확답은 못드리겠구요..

10k 이상이라면 text 형식 보다는.. -_-;;;;;

흠.. 여튼 꼭 인덱스를 원하신다면 풀텍스트 인덱스를 고려해보심이 좋을것 같습니다.

원하시는 기능을 구현하게 해주는 일반적인 인덱스 방식은 BTREE 밖에 없습니다. 이를 응용한 풀텍스트 인덱스나 아니면 소스트리의 contrib 의 풀텍스트 인덱스를 참조하시면 되겠습니다..

신기배(nonun)님이 2003-12-27 09:12에 작성한 댓글입니다.

게시판 본문을 인덱스를 잡고,

정녕코

where xxx like 'x%' 형태로 인덱스를 사용해야한다면,

create index table_contents_i on table (substr(contents, 1, 100))

이런식으로 부분 인덱스를 만드십시오.

 

그런데,

제가 보기에는

본문의 중간에 있는 내용으로 검색을 하려면, 결국 xxx like '%x%' 형태로 갈 수 밖에 없을터인데, 그러면 만들어놓은 인덱스를 사용하지 않을 것입니다.

 

그렇다면,

차라리 테이블 구조를 약간 바꾸어서

본문용 칼럼과 본문의 인덱스용 칼럼을 따로 두고 인덱스용 칼럼에 인덱스를 만드는 것이 더 타당하지 않을까싶네요.

 

근데, 게시판 본문을 정말로 like 'x%' 같이 검색하실 요량이십니까?

 

김상기(ioseph)님이 2003-12-27 10:57에 작성한 댓글입니다.

답변 감사드립니다.

일단 본문이 10k 인 것에 대해서 그 본문컬럼을 index 로 걸고 싶은 생각은 추호도 없습니다. ^^:

그냥 이렇게 통쨰로도 해보고 full text index 도 해보고

또는 부분 인덱스도 해보고 여러가지를 해 보았습니다.

그런 테스트 와중에 나온것이라서 제가 알기로도

btree 외엔 성격이 안 맞는거 만일 정말 그렇게 본문을 인덱스 걸려는

가정하에서 질문해 본 것입나다 ^^;

 

일단 대충의 자료 테스트를 위해서

여러가지 몇가지 테스트를 해 보았습니다.

원래 게시물이라는것이 하루 아침에 몇십만건 생기는것은 아니라서

full text index 를 처음부터 하면 어떻게 될지는 모르겠지만

기존 자료를 한꺼번에 넣고 할려니..

대충 내용이 있는 자료를 이용하여 입력하는데

6000 게시물에 대하여 full text index 인 경우 fti 의 row 가 무리 100 만을 넘어서더군요

6000 개 입력하는데도 너무나도 엄청난 시간이 걸려서.. 자료입력을 포기하고

대신 full text index 는 아니지만 본문을 512 주위로 빈칸을 이용하여

잘라 넣어 테스트를 해 보았습니다.

아무래도 full text index 보다는 효율이 떨어질지도 모르겠네요..

(근데 사실 그렇게 늦을거라곤 생각지 않습니다. fti 의 row 가 많으면 많을수록 본문내용이 길면 길수록 검색이 많은 row 가 검색되니깐.. 적당한 길이라면 적당한 row 만큼 나오니 검색은 빠를지 몰라도 조인이라던지 주위의 작업을통해 최종적으로 나오는 결과물은 적당한 길이로 자른것이 오히려 더 빠른경우가 허다하더군요..)

이렇게 하니 fti 의 갯수는 main 의 갯수의 대략 3 ~ 5 배의 갯수가 나오더군요..

아뭏튼 자료입력에 너무많은 시간이 걸려 모든걸 테스트 해볼수는 없었으나,

대충 지금은 그럭저럭 만족은 하고 있습니다.

(게시물 10만건 중 검색된 자료가 2만건 정도 나오는 검색에서도(본문은 대부분의 게시물에서 2k 이상을 차지하는 자료입니다.)

평균 1 초 수준에서 끝나니깐요..

오히려 검색하지 않고 전체 리스트를 보여주는게 시간이 더 걸리고 있는 상황입니다. ---;;

 

메인게시물에서 리스트에서 보여줄 항목들(id, num, subject, hit 등등) 을 따로 뺴내고, 제목과 본문은 512 앞뒤로 짤라 fti 에 따로 저장하고

리스트는 제목테이블에서 보여주며 검색은 fti 로 했습니다.

조인시 distinct 를 사용하고, 제목테이블에서 소트한후

offset 과 limit 를 적용하여 temp table 에 저장하고

tmp 에서 desc sort 후 계산하여 출력하는 방식을 채택했습니다.

 

전체 리스트는 제목리스트를 소트한후

전체페이지에서 페이지번호가 반 이하일경우는 앞부분에 offset 을 주고 반이후인경우에는 뒷부분에 offset 을 주어 limit 만큼 임시테이블에 저장하니

1페이지나 중간페이지나 5000 페이지가 넘어가는 페이지일지라도

대충 비슷한 속도를 가지네요 (처음부터만 옵셋을 가지면 페이지수가 많을 경우 뒤로 가면갈수록 속도저하가 심해지는데 이런식으로 하니

거의 전페이지가 속도가 비슷하게 나오는군요..

 

초보님이 2003-12-27 14:19에 작성한 댓글입니다. Edit

흐으음.. full text index 와 intersect 다시 한번 더 시도해봐야 겠네요..

 

fti_table intersect fti_table 은 생각도 못했네요..

 

그나저나 자료입력시간이 넘 오래걸려서 어캐 입력한다냐..아구..

 

초보님이 2003-12-27 14:47에 작성한 댓글입니다. Edit

쿼리 테스트를 위한 전체 자료 입력이라면, 당연히 python 같은 놈으로 일단 full text 자료를 만들고, fti 테이블에 copy 구문으로 일괄 입력한 다음에 인덱스를 만들어야지요. 그래야 쉽게 작업하실 수 있습니다.

 

그 다음 모든 것이 흡족하게 움직이면, 트리거를 하나 만드셔서 원문의 자료가 추가/수정/삭제 될 경우 fti 테이블의 자료를 변경하도록 해야겠지요.

 

전형적인 예제가 이곳 Files 자료실에 있는 full text index 관련 자료들입니다.

 

김상기(ioseph)님이 2003-12-28 00:34에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5126난감한 index... [6]
초보
2003-12-28
4415
5125tsearch2 사용기 [3]
김상기
2003-12-28
6005
5124rtree 인덱스 질문 [1]
김상기
2003-12-27
2862
5123serial 과 index (두가지질문) [5]
초보
2003-12-27
3364
5122[질문]serial 필드 생성시 만들어지는 시퀀스테이블... [5]
wooki
2003-12-26
3374
5120[jdbc]pgsql7.4 윈도우에서 JDBC사용?? 안되요?? [2]
황남주
2003-12-26
2435
5118postgresql이 중지되었을때 로그등이 남는지요? [1]
성치훈
2003-12-26
1952
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다