어딘지 기억이 잘 안나는데 예전에(?) 김상기님이 만드신 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 로 똑같이 복사가 아닌
랜덤하게 자료를 넣을 수 있는 방법도 소개좀 부탁드립니다.
|