1. 컬럼의 중간 부분의 검색

    create index from_loc_idx on orders (substr(ship_id,5,3));
    create index repair_loc_idx on orders (substr(ship_id,3,2), ord_date);


2. 조인 연결고리 컬럼이 대응하지 않는 경우의 해결


  ......

    from  item_group x, items y
    where x.class1||x.class2||x.class3 = y.group_cd ......
   
    ......
    from  item_gropu x, items y
    where x.class1 = substr(y.group_cd,1,2)
    and   x.class2 = substr(y.group_cd,3,2)
    and   x.class3 = substr(y.group_cd,5,3)
    ......
 
    create index group_cd_idx_ on item_group (class1||class2||class3);


3. 일자 컬럼이 분할된 경우의 해결

    where sal_yyyy >= '2005' and sal_mm >= '12' and sal_dd >= '10'    (x)
    where sal_yyyy||sal_mm||sal_dd >= '20051210'                           (o)  문제점 : Index 사용불가

    create index sal_date_idx on sales (sal_yyyy||sal_mm||sal_dd);
 

4. 데이타 타입이 상이한 조인 컬럼

    create index deptno_idx on emp(to_number(deptno));


5. 조인 컬럼이 경우에 따라 달라지는 경우

    .......
    from  sales s, department d
    where d.deptno = (case when sal_type = 1 then sal_dept else agent_no end)
    and   d.location = 'BUSAN'
    .......
 
    create index deptno_idx on sales
           (case when sal_type = 1 then sal_dept else agent_no end);
          
     
6. 대/소문자나 공백이 혼재된 컬럼의 검색

    create index ename_upper_ix on employees (upper(ename));
 
    create index ename_upper_ix on employees (upper(replace(ename,' '));


7. NULL 값을 치환하여 검색

    .....
    where  :input_date between start_date and nvl(end_date, '99991231');
    .....
   
    create index end_date_idx on account_history (nvl(end_date, '99991231'), start_date);


8. 복잡한 계산 결과의 검색

    create index order_amount_idx on order_items
        (item_cd, (order_price - nvl(order_discount,0)) * order_count));
       
    select /*+ index_desc(x order_amount_idx) */ *
    from   order_items x
    where  item_cd = :b1
    and    rownum <= 100;


9. 기간, 컬럼 길이 검색

    create index item_idx on activities (expire_date - start_date);
   
    create index source_length_idx on print_media (text_length(source_text));


10. 배타적 관계의 유일성 보장

    create unique index official_id_idx on customers
          (case when cust_type = 1 then resident_id else business_id end);
      
    select * from customers
    where (case when cust_type = 1 then resident_id else business_id end) = :b1;


함수기반 인덱스는 버전에 따라 제약사항에 차이가 있으므로 관련 메뉴얼을 참조하세요.


<참조> 새로쓴 대용량 데이타베이스 솔루션

'Database > Oracle' 카테고리의 다른 글

도메인 인덱스(Domain Index)  (0) 2010.04.28
비트맵 인덱스(Bitmap Index)  (0) 2010.04.28
비-트리 인덱스(B-Tree Index)  (0) 2010.04.27
Db file sequential read  (0) 2010.04.26
USER_CONS_COLUMNS  (0) 2010.04.22

+ Recent posts