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 5113 게시물 읽기
No. 5113
full text index 와 intersect
작성자
초보
작성일
2003-12-23 22:10
조회수
2,337

어딘지 기억이 잘 안나는데 예전에(?) 김상기님이 만드신 fti.sql(full text index 구현) 을 어제 시간이 좀 나서 대충 구현하고 테스트를 해 보았습니다.

 

제가 이해를 잘 못 하고 있는 것인지.. 오해를 하는 것인지는 모르겠으나,

FTI 의 목적은 대용량 데이타베이스에 대하여 빠른 검색을 위한 것인거 같습니다.

방법은 모든 문자열을 빈칸 단위로 짤라서 분리된 테이블에 저장하는 것이며,

이것을 토대로 검색하여 메인 테이블과 조인을 하여 원하는 결과를 내는 것인거 같습니다.

 

그런데 실제로 fti 에 대하여, 더 느린 속도를 보여줬습니다.

문제는 intersect 명령어 때문에 더 느려지는듯 합니다.

 

검색된 데이타의 갯수가 적을 경우에는 빠르게 나타난것도 같습니다만.

결과가 일정수(그건 잘.. 대충 많은 수) 를 넘어서면 오히려 FTI 가 더 느려지더군요

 

똑같은 자료를 15만건 while 문으로 넣고 테스트를 해 보았습니다.

(랜덤으로 만들어야 하지만 귀찮아서 걍 한 레코드를 15만게 복사)

그런후 fti 테이블에서 검색하여 정렬하여 메인테이블과 intersect 후

temp tb 에 넣고 이것을 메인테이블과 조인하여 결과를 뽑는데

상당한 시간이 걸리더군요

 

메인테이블의 레코드수는 15만게이지만

fti 테이블의 레코드는(대충 아무렇게한 하여 3중 정도를 넣었더랬습니다.)

350만개나 되어서 15만개에서 검색하는게 더 빨라지더라..라는 것입니다.

(레코드를모두 복사하여서인지 검색결과가 350만개나 나옵니다.)

실제적으로 결과물에 대하여 temp tb 에 insert 하는 시간은 금방 되었습니다.

 

이것은 b.fti like 'aaa%' 이것이나 like '%aaa%" 이것이나 모두 느렸으며,

결과 레코드수가 적을수록 like 'aa%' 와 like "%aa%' 는 엄청난 속도차이를 보입니다.

 

메인레코드 입력방식이 잘못되긴 했습니다만(똑같은 레코드 복사였으니..)

..

intersect 도 속도저하에 한몫을 했습니다.

차라리 sort 는 훨씬 빨랐습니다.

 

pgsql 소스상에서 contrib/fulltextindex 는 해보지 않았습니다.

 

FTI 내용에 대해 접근을 잘못한 것인지.. 방법이 잘못된 것인지.. 구현이 잘못된 것인지요..

 

 

p.s 저처럼 무식한 while 로 똑같이 복사가 아닌

랜덤하게 자료를 넣을 수 있는 방법도 소개좀 부탁드립니다.

 

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

full text index 관련 작업에 대한 테스팅은 실재 자료를 가지고 해봐야합니다.

 

intersect 때문에 속도가 떨어지지는 않는 것같습니다.

select num from fti where t like '가%'

intersect

select num from fti where t like '아%'

같이 각 개별 쿼리의 결과 자체가 많아서 속도가 떨어지는 것이지.

 

가장 테스팅 하기 좋은 곳이 이곳 oracle 게시판입니다. 오라클 게시판에서 검색 속도를 살펴보시면, 구현하려고 하는 방법이 틀리지 않았다는 것을 느끼지 않을까싶습니다.

 

검색어로 "가 & 아" 이런식의 무지막지한 검색결과를 요구하는 검색을 하지 않는다면 말이지요.

 

현재 full text index 에 대한 또 다른 방법을 생각중인데, (vector 로 처리 하는 방법) 이놈을 한번 구현해 보고, 이놈이 더 낫다면 이놈도 공개하도록 하지요.

(이론상으로는 지금 계획중인놈이 검색 속도는 약 4-6배 이상 빠를 것이라 예상되지만)

 

김상기(ioseph)님이 2003-12-26 13:44에 작성한 댓글입니다.

네.. 검색결과가 많아서인거 같습니다.

 

그렇다면.. 한가지만 더 물어보겠습니다.

 

intersect 와 distinct 와의 속도문제에 대해서인데..

 

intersect 를 사용한 이유는 distinct 와 마찬가지로

중복 데이타를 없애기 위함이었는데

 

(select a.id from main_table as a, fti as b where b.id like '가%' and a.id = b.id) intersect select id from main_table;

이런식으로 중복결과를 없앨려고 했었습니다.

 

또한 이와 대비적으로

select a.id from main_table as a, (select distinct on (id) id from fti where id like '가%') as b where a.id = b.id;

(쿼리가 맞는지 모르겠네요 아뭏든 이런식으로)

이렇게 해보니

intersect 보다도 아래의 경우가 좀 더 빨랐습니다.

 

아마도 결과는 같지만 쿼리문의 사용(?)이 속도를 상당히 저하 시키는거 같은데..

intersect 했을 당시 main_table 에는 10만여개,

그로 파생된 fti 에는 350 만개의 레코드가 들어있던상태였습니다.

 

똑같은 상황에서 똑같은 검색어로 검색해서

결과가 적은 경우, 많은 경우, 무지막지한 경우 등등에서

위와 같은 쿼리문일 경우 intersect 보다는 distinct 가 좀 더 빨랐던거 같네요..

아마도 intersect 를 무분별 사용해서 그런가...

전자의 경우는 fti 에서 검색하여 그것을 main 테이블과 조인하고

나온 결과를 다시 메인테이블 전체와 intersect 해버리는 것이고

후자의 경우는

fti 검색결과를 intersect 한 후 main 테이블과 조인하는 경우인데..

아마도 intersect 사용된 장소가 적합하지 않는 것일까요..?

 

 

p.s vecter 방식이라면...

tsearch2 에 언급된... 방식..?

 

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

아 위에 전자의 쿼리문 잘 못 써졌네요..

where b.id like '가%' and a.id = b.id 가 아니고

where b.fti like '가%' and a.id = b.id 입니다.

 

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

애구애구 후자도 마찬가지로 b.id like 가 아니라 b.fti like... 이고

그리고 main table 과의 조인문제는

main table 의 특정 컬럼을 소트해야(여기엔 없지만 실제 소스에서는 소트가 있습니다.) 하기 때문입니다.

 

그리고 vecter fti 도 기대할께요

 

 

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

참고 이곳 오라클 게시판에서의 검색 루틴의 한부분을 알려드릴게요.

 

select k as id from bd_47_fti where v like '부분%' intersect select k as id from bd_47_fti where v like '인덱스%' order by id desc

 

이렇게 fti 테이블에서 글번호들만 먼저 뽑아옵니다.

그리고는 해당 페이지 부분의 시작부분까지 건너띄고 페이지당 글갯수 만큼 다시 게시판 테이블에서 하나씩 가져옵니다. (쓰레드 표현하기 위해서)

이때, prepare, execute 구문을 이용합니다.

 

prepare getrow(int) as select id, subject, name, to_char(abstime(cdate), 'YYYY-MM-DD') as cdate,to_char(reads,'FM999,999,999,999') as reads, comments, deleted from bd_47 where id = $1

execute getrow(16763)

execute getrow(16574)

.....

 

이때 소용되는 시간이 웹 쪽 모든 작업을 다 해서 0.2초 정도네요.

물론 오라클 게시판 데이터가 10만건 정도는 아니지만, 게시물과 코멘트를 모두 합치면 약 5만건 정도는 될 듯싶네요.

 

여러가지 방법을 시도 해 보시고, 괜찮은 결과를 찾으셨으면, 이곳에 알려주시면 많은 분들이 도움을 받을 것같네요.

 

 

김상기(ioseph)님이 2003-12-27 10:33에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5118postgresql이 중지되었을때 로그등이 남는지요? [1]
성치훈
2003-12-26
1957
5115pgsql의 벡엔드 <-> 프론트엔드 프로토콜에 관한 자료가 없을까요? -.- [5]
신기배
2003-12-23
2152
5114index 의 차이? [1]
초보
2003-12-23
1741
5113full text index 와 intersect [5]
초보
2003-12-23
2337
5112웹에서 대용량 데이터 처리.. [1]
이상호
2003-12-23
1895
5111[질문] 현재 로그인한 User 의 그룹을 알고싶을때.. [2]
psql좋다
2003-12-22
1435
5110COPY는 되는데 \copy는 안됩니다!!! [2]
시나브로
2003-12-22
1977
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다