이 쿼리.. 개선해야할 부분좀 봐주셨으면 좋겠습니다. 0 3 978

by matrixkdg [SQL Query] [2016.12.30 13:58:18]


안녕하세요.

제가 나름 생각하고 생각해서 짠 UPDATE문 인데..

너무 비 효율적인거 같아서 개선점을 알고 싶어서 질문하게되었습니다.

일단 쿼리는 이렇게 나왔구요

UPDATE      TBL_PYRAMID_CORP_EXCL EXC
        SET         PYRAMID_CORP_CD = (
                                        SELECT B.PYRAMID_CORP_CD
                                        FROM    (
                                                   SELECT ROWNUM RNUM, CORP_NUM
                                                   FROM    (                    
                                                             SELECT     E.CORP_NUM
                                                             FROM        TBL_PYRAMID_CORP C
                                                                         ,TBL_PYRAMID_CORP_EXCL E                         
                                                             WHERE          SEQ = #SEQ#
                                                             AND         E.CORP_NUM = C.CORP_NUM(+)            
                                                             AND         C.PYRAMID_CORP_CD IS NULL
                                                             GROUP BY     E.CORP_NUM
                                                            ) 
                                                ) A
                                                ,(
                                                   SELECT ROWNUM RNUM,A.* 
                                                   FROM (
                                                               SELECT 'M'||(3099+LEVEL) PYRAMID_CORP_CD  
                                                               FROM DUAL  
                                                               CONNECT BY LEVEL <= 900
                                                               MINUS       
                                                               SELECT    A.CODE
                                                               FROM      COMMON_CODE A
                                                                        ,TBL_PYRAMID_CORP B
                                                               WHERE       A.CODE = B.PYRAMID_CORP_CD
                                                               AND         A.CODE >= 'M3100'
                                                           ) A      
                                                  ) B
                                          WHERE   A.RNUM         = B.RNUM
                                          AND     A.CORP_NUM     = EXC.CORP_NUM       
                                        )
        WHERE PYRAMID_CORP_CD IS NULL
        AND   DEL_YN     = 'N'
        AND   SEQ         = #SEQ#
        AND  CORP_NUM IN(       
                   SELECT      E.CORP_NUM
                FROM     TBL_PYRAMID_CORP C
                        ,TBL_PYRAMID_CORP_EXCL E                         
                WHERE     SEQ     = #SEQ#                     
                AND     E.CORP_NUM = C.CORP_NUM(+)
                AND     C.PYRAMID_CORP_CD IS NULL
        )

엑셀을 TEMP 테이블에 입력 후 이리저리 핸들링하는 한 부분인데

문제는 기존에 시퀀스를 사용하지 않고 있어서 코드테이블에서 특정 그룹 안에 속하는 코드 룰을 가지고 

코드를 넣어주는데 이게 또 설계당시 코드를 많이 사용 할거라 생각하지 않아 다른코드와 코드 사이에 남은 넘버를 사용하게 해놓은 탓에 삭제가 일어날 경우 그 넘버링 사이에 비는 코드를 찾아서 순서대로 넣어줘야 하는 상황입니다.

(나중에 코드가 부족하면 어떻게 하려는건진 모르겠네요..)

해서 connect by 를 사용하여 사용하지 않는 코드를 찾았고 

그리고 실제 코드를 넣어주는 테이블과 매핑관계를 만들려고 대상 데이터 를 추출해서

키관계를 주고자 rownum으로 ;;; 작성하게 되었습니다.

실제로 사용해보면 문제는 없는것 같은데 뭔가.. 개선점이 있을거 같아서 질문하게되었습니다.

 

 

 

 

 

by 마농 [2016.12.30 15:49:08]

2개 테이블간의 관계가 어떻게 되나요?
 - tbl_pyramid_corp, tbl_pyramid_corp_excl
 - 혹시 tbl_pyramid_corp 에서 갱신 대상 추출해서 tbl_pyramid_corp_excl 에 담은 건 아닌지요?
 - 그렇다면? tbl_pyramid_corp_excl 없이 바로 tbl_pyramid_corp 에서 작업하면 되는 것 아닌지?
common_code 테이블에 이미 모든 코드가 있는것 아닌가요?
 - 그렇다면? Connect By Level 은 필요 없을 듯 한데요.
seq 항목은?
 - 어떤 역할을 하나요?


by matrixkdg [2016.12.30 18:19:03]

앗 이제봤네요!!

2개 테이블간의 관계가 어떻게 되나요?
 - tbl_pyramid_corp, tbl_pyramid_corp_excl

답변 :   tbl_pyramid_corp_excl테이블에 들어 오는것은 신규 데이터이고

  corp테이블은 기존 데이터 테이블 입니다. 그래서 마구자비로 들어오는 데이터 중 신규건을 걸 러내는 작업을 하였습니다.

 - 그렇다면? tbl_pyramid_corp_excl 없이 바로 tbl_pyramid_corp 에서 작업하면 되는 것 아닌지?

데이터의 유효성 검사 이후 또다른 테이블 insert 해야하는 것도 있고 일종의 매핑관계 데이터도 같이 들어오기때문에 임시 테이블에 넣는 방법으로 작업하게 되었습니다.  데이터 적합성 문제가 너무도 많고 중복도 너무도 많아 핸들링하기 편하도록 임시테이블을 사용하게 되었습니다.


common_code 테이블에 이미 모든 코드가 있는것 아닌가요?

답변: common_code테이블에선 기존에 max값으로 작업을 하였기 때문에 중간에 삭제 액션이 일어나면

common_code테이블에서도 해당 코드값이 지워지는 형태입니다. 그렇기 때문에 삭제가 되고 이후에 다시 업로드를 하는 경우 중간에 빠져있는 코드를 가져오기위해 Connect by를 사용하게 되었습니다.
 

seq 항목은
 - 어떤 역할을 하나요?

답변 : seq 항목은 엑셀을 업로드 하는 채번으로 사용하고 있습니다. 한번의 엑셀을 업로드 처리 이후 임시테이블의 데이터를 날리지않고 업로드 했던 유저나 시간대 등을 기록하고 있으며 데이터 처리시 기준이 되는 키로 사용되고 있습니다.

 

이상입니다. 감사합니다!!


by 마농 [2017.01.02 09:28:53]

common_code 가 동시 삭제되는 구조라면?
  - common_code 와 tbl_pyramid_corp 와의 조인은 무의미해 보이네요.
  - 둘중 한가지만 사용하면 될 듯 하네요.
성능개선은
  - 서브쿼리가 반복적으로 사용되는 구조입니다.
  - 서브쿼리를 한번만 사용하도록 개선되어야 합니다.
  - MERGE 구문을 이용해 보세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입