질의작성

시스템 테이블을 이용한 인덱스 생성 구문 만들기

by janus posted Dec 02, 2009

CUBRID에서 지원하는 언로드 유틸을 통하여 인덱스생성 구문을 만들 수 있다.
그러나 unique index, primary key, foreign key 를 만들기 위해서는 별도의 수작업이 필요하므로
아래 질의와 같이 시스템 카다로그인 db_index, db_index_key 시스템테이블을 이용한 생성구문을 만들 수 있다.

select 'CREATE' || decode(ax.is_reverse, 'YES', ' REVERSE', '')
                || decode(ax.is_unique, 'YES', ' UNIQUE', '')
                || ' INDEX ' || ax.index_name || ' ON ' || ax.class_name || bx.key_attr || ' ;' as create_index_value
from   db_index ax,
       (
            select class_name,  index_name,
                   '(' || max(S.a)
                       || decode( max(S.b),'','',',' || max(S.b))
                       || decode( max(S.c),'','',',' || max(S.c))
                       || decode( max(S.d),'','',',' || max(S.d))
                       || decode( max(S.e),'','',',' || max(S.e))
                       || decode( max(S.f),'','',',' || max(S.f))
                       || decode( max(S.g),'','',',' || max(S.g))
                       || decode( max(S.h),'','',',' || max(S.h))
                       || decode( max(S.i),'','',',' || max(S.i))
                       || decode( max(S.j),'','',',' || max(S.j))
                       || decode( max(S.k),'','',',' || max(S.k))
                       || decode( max(S.l),'','',',' || max(S.l))
                       || ')' as key_attr
            from  (
                    select A.class_name  as class_name, A.index_name  as index_name,
                        decode(B.key_order,0,  B.key_attr_name,'') as a,
                        decode(B.key_order,1,  B.key_attr_name,'') as b,
                        decode(B.key_order,2,  B.key_attr_name,'') as c,
                        decode(B.key_order,3,  B.key_attr_name,'') as d,
                        decode(B.key_order,4,  B.key_attr_name,'') as e,
                        decode(B.key_order,5,  B.key_attr_name,'') as f,
                        decode(B.key_order,6,  B.key_attr_name,'') as g,
                        decode(B.key_order,7,  B.key_attr_name,'') as h,
                        decode(B.key_order,8,  B.key_attr_name,'') as i,
                        decode(B.key_order,9,  B.key_attr_name,'') as j,
                        decode(B.key_order,10, B.key_attr_name,'') as k,
                        decode(B.key_order,11, B.key_attr_name,'') as l
                    from db_index     A,
                         db_index_key B
                    where A.class_name = B.class_name
                      and A.index_name = B.index_name
                    order by A.class_name, A.index_name, B.key_order
            ) as S
        group by class_name, index_name
       ) bx
where  ax.class_name in ( select C.class_name
                         from db_class C
                         where C.class_type = 'CLASS'
                           and C.owner_name <> 'DBA'  -- 특정 계정이 소요한 테이블을 제외할 수 있다.
                         )
  and    ax.class_name = bx.class_name
  and    ax.index_name = bx.index_name
order by bx.class_name, bx.index_name     ;

만약 index가 아닌 PK, FK일 경우 조건 중 ax.is_primary_key, ax.is_foreign_key 컬럼의 값(YES, NO)를 이용하여 PK, FK 생성 구문을 만들 수 있다.
PK를 생성구문을 만들고 싶을 경우  "ALTER TABLE  ax.class_name ADD PRIMARY KEY(bx.key_attr);" 문과 같이 생성할 수 있도록 수정해 주면 된다.


Articles

4 5 6 7 8 9 10 11 12 13