DataBase/SQL

SQL BOOSTER - 문서번호 처리 기술

now0204 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 카테시안 곱을 통해 백만 건의 데이터 생성