ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.