728x90
반응형

대용량의 데이터 예를 들어 1000만건의 데이터가 있다고 칩시다...

이런경우 제목이나 내용 검색시 like '%사랑%'

이런식으로 하면 인덱스가 안타잖아요... 도저히 이 방법으로는 안될거 같구요..

여기저기 찾아보니 제목이나 내용을 공백으로 나누어서 검색할수 있는 칼럼을 따로

만들어야 된다고 하신분도 있던데요.. 근데 내용까지 검색칼럼으로 만들면 너무 많아지지 않나요?

아닌가? 혹시 다른 방법은 없는가요? ㅠ.ㅠ

역시 프로그램은 SQL이 가장 중요하네요. ㅋㅋㅋ

네이버 블로그에서는 왜그리 빠른지.. 데이터도 엄청 많을건데....

아시는 분 있으면 답변 좀 부탁드립니다. ^^

 

- 이 글을 읽어주셔서 감사합니다 -

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

인터미디어 텍스트 인덱스라는 것이 있습니다.

그 안에는 사용자 정의 인덱스 타입이 있는데

이 것이 내부적으로 토크나이저를 가지고 있어서 토큰단위로 분리한

자체 인덱스를 가지고 있어서 검색에 사용 가능하구요

인터미디어 텍스트 인덱스는 인덱스의 동기화가 지연되므로

텍스트 자체가 그리 크지 않고 많은 기능이 필요한 것이 아닌

단순 토큰 검색에 사용하시려면 인터미디어 텍스트의 카탈로그 인덱스를 쓰시면 좋습니다.

예제는

 

SQL> create table cattest
  2  (id number,contents varchar2(4000));

테이블이 생성되었습니다.

SQL> insert into cattest select object_id,object_name from all_objects;

29504 개의 행이 만들어졌습니다.

SQL> alter table cattest add primary key(id);

테이블이 변경되었습니다.

SQL> create index ix_cattest on cattest (contents)
  2  indextype is ctxsys.ctxcat;

인덱스가 생성되었습니다.

 

SQL> set autotrace on
SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1  select * from cattest where catsearch(contents,'java',null) > 0
  2* and rownum < 10
SQL> /

        ID
----------
CONTENTS
--------------------------------------------------------------------------------
     19077
/3b25c3cc_Java

     22090
ALL_JAVA_ARGUMENTS

     22054
ALL_JAVA_CLASSES


        ID
----------
CONTENTS
--------------------------------------------------------------------------------
     22102
ALL_JAVA_DERIVATIONS

     22078
ALL_JAVA_FIELDS

     22066
ALL_JAVA_IMPLEMENTS


        ID
----------
CONTENTS
--------------------------------------------------------------------------------
     22072
ALL_JAVA_INNERS
......

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=40 Card=9 Bytes=1132
          320)

   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'CATTEST' (Cost=40 Card
          =560 Bytes=1132320)

   3    2       DOMAIN INDEX OF 'IX_CATTEST'

 


Statistics
----------------------------------------------------------
         86  recursive calls
          0  db block gets
        226  consistent gets
          0  physical reads
          0  redo size
        700  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed

 

보시면

 

IX_CATTEST 라는 인덱스를 쓰는 것이 보이시죠

 

김흥수(protokhs)님이 2005-03-23 23:33:52에 작성한 댓글입니다.

참고로... 네이버나 다음등에서는 검색엔진이라는것을 사용합니다.

데이터베이스에 있는 내용을 따로 검색엔진에 DB(색인디비입니다)를 만들어서 사용하죠. 간단히 설명드리면 모든 단어에 index를 걸어놓는것과 같습니다. 본문에 수많은 단어들이 있는데 like로 하면 시간이 얼마나 걸리겠습니까? 그래서 단어별로 책의 목차나 색인처럼 다시 만드는거죠. 저도 DBA로 검색엔진 프로젝트에 많이 참여해보았는데 오라클이나 SQL Server로써는 도저히 불가능한 검색을 가능하게 해줍니다. 예를들면 lob타입의 본문이 1000만건있을경우 그 본문의 한단어를 찾을때 오라클에서 sql구문으로는 답이 안나오죠. ^^ 검색엔진을 사용하면 2,3초 안에 나옵니다. 방법의 차이죠.  

차니님이 2005-03-24 10:38:32에 작성한 댓글입니다. Edit

검색엔진이 DB를 컨트롤 하는거였나요?

 

파일검색인줄 알았는데....  제가 잘못알고 있었나보네요...

 

윗분들이 좋은 말씀해주셔서 모 따로 말할것도 없지만...

 

참고로.. 1000만건정도면 대용량도 아니고.. 또한 대용량을 쓰는곳은 시스템도 워낙에 빵빵해서 잘돌아갑니다.... 몇십억짜리 시스템이니.. ㅋㅋ  1000만건정도야 우습죠...  like 검색해도...

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,