-
SQL BOOSTER - 문서번호 처리 기술DataBase/SQL 2024. 7. 9. 22:41
1. SELECT MAX 방식
현업에서는 일자+순번으로 문서번호를 관리할 수도 있으며, 법인+일자+순번 등으로 문서번호를 관리한다.
CREATE TABLE T_PO ( PO_NO VARCHAR2(40) NOT NULL, TIT VARCHAR2(100) NULL, //... ); CREATE UNIQUE INDEX PK_T_PO ON T_PO(PO_NO); ALTER TABLE T_PO ADD CONSTRAINT PK_T_PO PRIMARY KEY(PO_NO) USING INDEX;
구매오더번호의 채번 규칙은 다음과 같다
- PO(고정문자)+YYYYMMDD(요청일자)+NNNNNNNN(순번8자리)
DECLARE v_NEW_PO_NO VARCHAR2(40); v_REQ_DT DATE; v_REQ_YMD VARCHAR2(8); BEGIN v_REQ_DT := TO_DATE(20170301 23:59:59, 'YYYYMMDD HH24:MI:SS'); v_REQ_YMD := TO_CHAR(v_REQ_DT, 'YYYYMMDD'); SELECT 'po' || V_REQ_YMD || LPAD(TO_CHAR(TO_NUMBER(NVL(SBSTR(MAX(T1.PO_NO)-8,'0')+1),8,'0') INTO v_NEW_PO_NO FROM T_PO T1 WHERE T1.REQ_DT >= TO_DATE(v_REQ_YMD,'YYYYMMDD') AND T1.REQ_DT <TO_DATE (v_REQ_YMD,'YYYYMMDD')+1; //..
해당 PL/SQL은 T_PO에서 요청일자에 해당하는 가장 큰 PO_NO를 가져와 새로운 PO_NO를 채번하고 있다.
채번 과정을 보면, MAX,SUBSTR,TO_CHAR,LPAD와 같은 함수를 복잡하게 사용하고 있다.
이와 같은 방식을 SELECT ~ MAX 방식이라 한다.
해당 방식은 성능 이슈와 잠재적인 오류를 내포하고 있다.
1.2 SELECT MAX 방식의 성능
SELECT ~ MAX 채번 방식의 성능 문제를 알아보자
아래 SQL을 통해 100일 간에 해당하는 테스트 데이터를 생성해보자
INSERT INTO T_PO (PO_NO, TIT, REQ_DT, REQ_UID) SELECT 'PO'||T2.REQ_YMD||LPAD(TO_CHAR(T1.RNO),8,'0') PO_NO, 'TEST PO' TIT ,TO_DATE(T2.REQ_YMD,'YYYYMMDD') + (RNO /60 /60/ 24) REQ_DT, 'TEST' REQ_UID FROM (SELECT ROWNUM RNO FROM DUAL CONNECT BY ROWNUM <= 10000) T1, ( SELECT TO_CHAR(TO_DATE('20170101','YYYYMMDD')+(ROWNUM -1), 'YYYYMMDD') REQ_YMD FROM DUAL A CONNECT BY ROWNUM <= 100 ) T2; ) COMMIT;
- ROWNUM 만개와 REQ_YMD 카테시안 곱을 통해 백만 건의 데이터 생성
'DataBase > SQL' 카테고리의 다른 글
SQL BOOSTER 페이징 기술 (0) 2024.07.11 SQL BOOSTER - 분석함수 (0) 2024.07.10 SQL BOOSTER - 트랜잭션 (0) 2024.07.08 데이터 모델링 - 실체 엔터티 (0) 2024.06.26 SQL BOOSTER - HASH JOIN과 성능 (0) 2024.06.24