IT

    1) 일련번호 채번
        * sequence : 가장 효율적이고 정확한 방법
        * max()+1 : 현업에서 여전히 많이 사용되는 방법, 데이터 중복 가능성을 염두에 두고 개발을 해야 하며

                         Sequence보다 성능상 비효율

 

        * 문제가 되는 일련번호 채번 방식
        SQL> SELECT LPAD( DECODE(MAX(EMPLOYEE_ID),'','0000001',(MAX(EMPLOYEE_ID)+1)), 7, 0)

                 FROM EMPLOYEES;
        ----------------------------------------------------------------------------------
        | Id  | Operation                  | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
        ----------------------------------------------------------------------------------
        |   0 | SELECT STATEMENT |                          |      1 |       3 |        1   (0)| 00:00:01 |
        |   1 |  SORT AGGREGATE   |                          |      1 |       3 |                 |             |
        |   2 |   INDEX FULL SCAN   | EMP_EMP_ID_PK |   107 |    321 |        1   (0)| 00:00:01 |
        ----------------------------------------------------------------------------------
        * index fast full scan을 사용해 효율적인 듯 하지만 심각한 문제 있음
        * index fast full scan은 index의 leaf node전체를 muiti block I/O 를 통해 읽게 됨
        * 그결과 모든 Index Entry를 읽게 됨
        * 일련번호 1개를 채번하기 위해서 지나친 비효율성임
        * 현업에서 접수 일련번호 채번은 동시 다방적으로 발생하는일이 다반사
        * row가 늘어갈수록 성능저하가 되는건 당연함 

 

    2) sequence 생성 예제
        CREATE SEQUENCE JUPSU_SEQ START WITH 1 INCREMENT BY 2 MAXVALUE 100000000 NOCYCLE CACHE 20;
            - JUPSU_SEQ : 시퀀스명
            - START WITH : 시작번호
            - INCREMENT BY : 증가되는 단위, 양/음수 가능
            - MAXVALUE : 시퀀스의 최대값
            - NOCYCLE : 최대값 도달시 에러발생후 중지하는 옵션. 디폴트암
            - CYCLE : 최대값 도달시 MINVALUE(1)부더 다시 시작
            - CACHE : 미리 메모리상(SGA)에 20개의 일련번호를 생성해두는 옵션.

                            일련번호가 동시에 많이 필요한 경우 유용한 옵션. 디폴트 20
     
        SQL> SELECT JUPSU_SEQ.NEXTVAL FROM DUAL; //호출할 때마다 증가된 값 리턴
        SQL> SELECT JUPSU_SEQ.CURRVAL FROM DUAL; //호출할 때마다 현재 값 리턴
        SQL> SELECT TO_CHAR(JUPSU_SEQ.NEXTVAL,'fm0000000000') FROM DUAL; //문자형 일련번호 생성

 

        * 시퀀스는 대부분 INSERT절에 사용됨 
        * 시퀀스는 거의 자원을 소모하지 않음 강추함

 


Posted by sinpk