대용량의 데이터 예를 들어 1000만건의 데이터가 있다고 칩시다...
이런경우 제목이나 내용 검색시 like '%사랑%'
이런식으로 하면 인덱스가 안타잖아요... 도저히 이 방법으로는 안될거 같구요..
여기저기 찾아보니 제목이나 내용을 공백으로 나누어서 검색할수 있는 칼럼을 따로
만들어야 된다고 하신분도 있던데요.. 근데 내용까지 검색칼럼으로 만들면 너무 많아지지 않나요?
아닌가? 혹시 다른 방법은 없는가요? ㅠ.ㅠ
역시 프로그램은 SQL이 가장 중요하네요. ㅋㅋㅋ
네이버 블로그에서는 왜그리 빠른지.. 데이터도 엄청 많을건데....
아시는 분 있으면 답변 좀 부탁드립니다. ^^
- 이 글을 읽어주셔서 감사합니다 -
인터미디어 텍스트 인덱스라는 것이 있습니다.
그 안에는 사용자 정의 인덱스 타입이 있는데
이 것이 내부적으로 토크나이저를 가지고 있어서 토큰단위로 분리한
자체 인덱스를 가지고 있어서 검색에 사용 가능하구요
인터미디어 텍스트 인덱스는 인덱스의 동기화가 지연되므로
텍스트 자체가 그리 크지 않고 많은 기능이 필요한 것이 아닌
단순 토큰 검색에 사용하시려면 인터미디어 텍스트의 카탈로그 인덱스를 쓰시면 좋습니다.
예제는
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 라는 인덱스를 쓰는 것이 보이시죠
참고로... 네이버나 다음등에서는 검색엔진이라는것을 사용합니다.
데이터베이스에 있는 내용을 따로 검색엔진에 DB(색인디비입니다)를 만들어서 사용하죠. 간단히 설명드리면 모든 단어에 index를 걸어놓는것과 같습니다. 본문에 수많은 단어들이 있는데 like로 하면 시간이 얼마나 걸리겠습니까? 그래서 단어별로 책의 목차나 색인처럼 다시 만드는거죠. 저도 DBA로 검색엔진 프로젝트에 많이 참여해보았는데 오라클이나 SQL Server로써는 도저히 불가능한 검색을 가능하게 해줍니다. 예를들면 lob타입의 본문이 1000만건있을경우 그 본문의 한단어를 찾을때 오라클에서 sql구문으로는 답이 안나오죠. ^^ 검색엔진을 사용하면 2,3초 안에 나옵니다. 방법의 차이죠.
검색엔진이 DB를 컨트롤 하는거였나요?
파일검색인줄 알았는데.... 제가 잘못알고 있었나보네요...
윗분들이 좋은 말씀해주셔서 모 따로 말할것도 없지만...
참고로.. 1000만건정도면 대용량도 아니고.. 또한 대용량을 쓰는곳은 시스템도 워낙에 빵빵해서 잘돌아갑니다.... 몇십억짜리 시스템이니.. ㅋㅋ 1000만건정도야 우습죠... like 검색해도...
'SQL > ORACLE' 카테고리의 다른 글
[Oracle]오라클 암호화, 복호화 (0) | 2014.02.12 |
---|---|
[Oracle]개발팁 모음 (0) | 2014.02.12 |
[Oracle]ora-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다 (0) | 2014.02.12 |
[Oracle]원단위 절삭 trunc함수 (0) | 2014.02.12 |
[oracle]프로시저를 이용한 테스트 데이터 만드는 프로시저 (0) | 2014.02.12 |
[Oracle]파티션 테이블 만들기 및 수정 (0) | 2014.02.12 |
[oracle]칼럼명 변경 (0) | 2014.02.12 |
[Oracle]comment 주기, 생성할때 테이블스페이스 지정하기 (0) | 2014.02.12 |