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절에 사용됨
* 시퀀스는 거의 자원을 소모하지 않음 강추함
'소프트웨어 > Oracle' 카테고리의 다른 글
SQL Developer 날짜(date)형식 시,분,초 단위까지 표시하는 방법 (0) | 2013.08.28 |
---|---|
OVER()함수 (0) | 2013.08.27 |
Toad 단축키 (0) | 2013.08.05 |
Number타입 컬럼의 자바 클래스의 필드 타입 (0) | 2013.07.15 |
오라클 힌트 (0) | 2013.07.15 |