index는 oracle내의 table data를 access 하기 위한 access patch를 제공하는 segment 입니다.
즉, 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='I_EMP'
SQL> /

INDEX_NAME                     COLUMN_NAME          DESC
------------------------------ -------------------- ----
I_EMP                          DEPTNO                     ASC
I_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
SQL> /

INDEX_NAME                     COLUMN_EXPRESSION    COLUMN_POSITION
------------------------------ -------------------- ---------------
I_EMP                          "SAL"                              2  

즉, "I_EMP index의 두번째 column은 EMP table의 SAL의 가공으로 만들어진 column 이다."


이상의 내용은 다음의 metalink 문서를 참조했습니다.
Note 272357.1 Column name of a descending index is system generated: SYS_NCnnnnn$




+ Recent posts