Index는 Oracle내의 table data를 access 하기 위한 access patch를 제공하는 segment 입니다.
즉, table의 data access를 index를 참조해서 scan하게 됩니다.
따라서 index 생성시 자주 scan 되는 방식으로 index를 구성하면 굳이 query 시 테이블 데이터를 순차적으로 ordering 할 필요가 없게 됩니다. 다음의 예제 처럼 SCOTT의 EMP table이 SAL의 역순으로 자주 query가 수행된다면 다음처럼 역순으로 index를 생성할 수 있습니다.
위의 구문으로 index를 생성한다면 query 시 해당 index를 이용하게끔 만들어 준다면 order by 등의 구문과 그에 따른 sorting 작업은 필요없게 됩니다.
그런데, "SAL DESC"는 어떤 index column 이름을 갖게 될까요?
SAL_DESC 등의 이름을 갖는다면 dba_ind_column에서 대충 해당 column이 table의 어떤 column으로 부터 만들어 졌는지 확인할수 있겠지만, oracle은 이와 같은 index column이름을 SYS_NCnnnnn$라는 형식의 이름으로 생성하게 됩니다. 이와 같이 oracle이 자체적으로 이름을 생성하는 것은 대개 constraint 생성할 때 이름을 지정하지 않는 경우에 많이 볼수 있습니다.
그러면 위의 "SYS_NC00009$" column은 EMP table의 어떤 column에 의해 만들어진걸까요?
이 정보는 DBA_IND_EXPRESSIONS에서 확인할 수 있습니다.
즉, "IDX_EMP index의 두번째 column은 EMP table의 SAL의 가공으로 만들어진 column 이다."
즉, table의 data access를 index를 참조해서 scan하게 됩니다.
따라서 index 생성시 자주 scan 되는 방식으로 index를 구성하면 굳이 query 시 테이블 데이터를 순차적으로 ordering 할 필요가 없게 됩니다. 다음의 예제 처럼 SCOTT의 EMP table이 SAL의 역순으로 자주 query가 수행된다면 다음처럼 역순으로 index를 생성할 수 있습니다.
create index IDX_EMP on SCOTT.EMP(DEPTNO, SAL DESC);
위의 구문으로 index를 생성한다면 query 시 해당 index를 이용하게끔 만들어 준다면 order by 등의 구문과 그에 따른 sorting 작업은 필요없게 됩니다.
그런데, "SAL DESC"는 어떤 index column 이름을 갖게 될까요?
SAL_DESC 등의 이름을 갖는다면 dba_ind_column에서 대충 해당 column이 table의 어떤 column으로 부터 만들어 졌는지 확인할수 있겠지만, oracle은 이와 같은 index column이름을 SYS_NCnnnnn$라는 형식의 이름으로 생성하게 됩니다. 이와 같이 oracle이 자체적으로 이름을 생성하는 것은 대개 constraint 생성할 때 이름을 지정하지 않는 경우에 많이 볼수 있습니다.
SQL> select index_name, column_name, descend from dba_ind_columns where index_name='IDX_EMP'
SQL> /
INDEX_NAME COLUMN_NAME DESC
------------------------------ -------------------- ----
IDX_EMP DEPTNO ASC
IDX_EMP SYS_NC00009$ DESC
SQL> /
INDEX_NAME COLUMN_NAME DESC
------------------------------ -------------------- ----
IDX_EMP DEPTNO ASC
IDX_EMP SYS_NC00009$ DESC
그러면 위의 "SYS_NC00009$" column은 EMP table의 어떤 column에 의해 만들어진걸까요?
이 정보는 DBA_IND_EXPRESSIONS에서 확인할 수 있습니다.
SQL> select index_name, column_expression, column_position from DBA_IND_EXPRESSIONS where index_name = 'IDX_EMP'
SQL> /
INDEX_NAME COLUMN_EXPRESSION COLUMN_POSITION
-------------------------- ------------------------- ---------------
IDX_EMP "SAL" 2
SQL> /
INDEX_NAME COLUMN_EXPRESSION COLUMN_POSITION
-------------------------- ------------------------- ---------------
IDX_EMP "SAL" 2
즉, "IDX_EMP index의 두번째 column은 EMP table의 SAL의 가공으로 만들어진 column 이다."
'Database > Oracle' 카테고리의 다른 글
[펌] Oracle 11g For windows 삭제방법 (0) | 2013.02.11 |
---|---|
그룹바이로 다중 로우를 단일 로우로 출력하기(WMSYS.WM_CONCAT 이용) (0) | 2013.01.28 |
UNDO TABLESPACE 조회 (0) | 2012.07.10 |
[펌]윈도우7에서 오라클10g 설치하기 (0) | 2012.04.18 |
[펌] Oracle Tablespace 추가/변경 (0) | 2012.03.19 |