갑자기 친구한테서 문의가 들어왔는데..잘 안되서 질문 드립니다.
fingerprint 라고 화합물의 구조를 담고 있는 t_bit 테이블에서 해당 구조를 만족하는 id 를 가져오는 쿼리의 성능 문제입니다.
원래는 fp0 ~ fp15까지 64byte 를 담고 있는 테이블인데, 간단한 테스트를 위해 다음과 같이 생성했습니다.
참고자료(여기서는 인덱스를 고려하지 않았으며,Mysql 로 fp1&255=255 라고 bitand 대신 사용했습니다.)
http://depth-first.com/articles/2008/10/02/fast-substructure-search-using-open-source-tools-part-1-fingerprints-and-databases/
create table t_bit (
id number ,
fp1 number,
fp2 number,
fp3 number,
fp4 number,
fp5 number,
fp6 number,
fp7 number,
fp8 number)
insert into t_bit
select
level lvl,
round(dbms_random.value*1000000000000) fp1,
round(dbms_random.value*1000000000000) fp2,
round(dbms_random.value*1000000000000) fp3,
round(dbms_random.value*1000000000000) fp4,
round(dbms_random.value*1000000000000) fp5,
round(dbms_random.value*1000000000000) fp6,
round(dbms_random.value*1000000000000) fp7,
round(dbms_random.value*1000000000000) fp8
from dual connect by level <=100000 ;
BEGIN
dbms_stats.gather_table_stats(user,'T_BIT') ;
END ;
/
*** row 조회용 쿼리 예
select * from t_bit A
where bitand(fp1, 255)=255 and bitand(fp2, 255)=255 and bitand(fp3, 16384)=16384
*** plan
SELECT STATEMENT, GOAL = ALL_ROWS 251 1 68
TABLE ACCESS FULL EV T_BIT 251 1 68
*** 질문
16개의 인덱스를 추가해도 되는데, 어떤 방법이 가장 효율적일까요? 데이타는 현재 2천만건이랍니다.
인덱스를 사용하여 빠른 Access 를 할수 있도록 개인적으로 모든 칼럼에 혹시나 하는 마음에 아래와 같이 인덱스를 추가 했지만 아무런 성능 개선이 없습니다.
방법이 없는걸까요? bitmap index 나 function based index 외 다른게 필요할것 같기도 하네요.
조언 부탁 드립니다.