질문합니다.. 0 4 1,510

by 요미코미 [Oracle Tuning] 튜닝 [2014.03.11 17:56:08]


안녕하세요. 튜닝하다가 질문드립니다

TO-BE
각 이력별로 JobName 단위로 최근 건이 아닌 것을 삭제

배경 : 배치작업이 수행될 때마다 이력테이블에 step, job에 대한 이력정보가 쌓입니다...

이력정보가 많이 쌓이면 이력조회 성능이 저하되어 lastcount값(30000)이 입력되어 지난 30000건을 삭제하고 최근것만 남기는
쿼리입니다..


--
(SELECT A.JOB_NAME,
    B.JOB_EXECUTION_ID,
    ROW_NUMBER() OVER(PARTITION BY A.JOB_NAME ORDER BY B.CREATE_TIME DESC) AS LATEST
   FROM BATCH_JOB_INSTANCE A, BATCH_JOB_EXECUTION B
  WHERE A.JOB_INSTANCE_ID = B.JOB_INSTANCE_ID) C
여기서 C.LATEST > #latestCount# 를 먼저 처리하여 건수를 최대한 줄이고 조인하는 것이 효과가 있을듯한데..


혹 더 좋은 방법이 있나요? 고수님들의 조언 부탁드립니다.

by 임상준 [2014.03.12 09:04:04]
어제 이거 읽었는데 오늘 똑같은 케이스 튜닝 요청 건이 들어왔네요...
저거 c.latest 조건은 선처리 불가는한거 아닌가요? 저도 좀 고민 해봐야겠네요ㅋㅋ 

by 임상준 [2014.03.12 11:19:53]

c 안의 윈도우 함수를 밖으로 빼서 조건절이 c 안으로 push 되게 한다음에,
서브쿼리로 한번 묶고 바깥에서 LATEST > #latestCount# 를 사용하면 되지 않을지... 


by 부쉬맨 [2014.03.12 13:08:28]
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT
 WHERE STEP_EXECUTION_ID IN
   (SELECT B.STEP_EXECUTION_ID
  FROM BATCH_STEP_EXECUTION A,
   BATCH_STEP_EXECUTION_CONTEXT B,
   (select * from 
   (
     (SELECT A.JOB_NAME,
     B.JOB_EXECUTION_ID,
     ROW_NUMBER() OVER(PARTITION BY A.JOB_NAME ORDER BY B.CREATE_TIME DESC) AS LATEST
    FROM BATCH_JOB_INSTANCE A, BATCH_JOB_EXECUTION B
  WHERE A.JOB_INSTANCE_ID = B.JOB_INSTANCE_ID) C
  ) where AND C.LATEST > #latestCount# ) cc
WHERE A.STEP_EXECUTION_ID = B.STEP_EXECUTION_ID
   AND A.JOB_EXECUTION_ID = CC.JOB_EXECUTION_ID)

by 요미코미 [2014.03.12 13:52:27]
감사합니다 ^ㅡ^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입