8.5.1 발생이력, 변경이력의 경우 최신 값에 대한 기능성 컬럼이 존재하지 않아 성능 저하
일반적으로 업무적인 필요에 따라 모델링을 진행한 접수통계 테이블은 변경 이력 테이블로, 사업소마다 접수받은 물량에 대한 정보를 가지고 있는 테이블이다. 사업소마다 접수구분코드가 '01'인 접수물량을 합한 정보를 가져와야 한다고 하면 다음과 같이 복잡한 SQL 구문이 작성된다.
SQL구문작성시 그룹함수를 사용하면 그룹의 대상이 많아짐에 따라 성능이 저하되는 것은 당녀한 현상이다. 위의 접수통계 테이블에서는 사업코드에 따라 최근에 변경된 내용에 대한 데이터를 가져오기 위해 'SELECT 사업소코드, MAX(변경일자) ~ GROUP BY 사업소코드'의 형식으로 SQL문을 작성할 수 밖에 없다.실행계획을 보면 인라인뷰를 사용했으므로 VIEW라는고 하는 단어가 있고 SORT(GROUP BY)가 있어 데이터를 가져오기 위해 중간 단계에서 정렬작업이 발생되었음을 알 수 있다.
그래서 접수통계 테이블에 최신여부를 나타내는 기능성 컬럼을 포함하면 그림8-19와 같이 SQL구문이 잘성될 것이다.
최신 여부 컬럼이 접수통계 테이블에 있으므로 데이터를 조회할 때 별도의 인라인뷰를 작성할 필요 없이 SQL WHERE절에 '최신여부=Y'만 있으면 데이터를 쉽게 처리할수 있고 SQL문의 처리 성능이 향상된다.
단 새로운 데이터가 입력될때 이전 변경일자에 대한 최신여부 값을 'Y'에서 'N'으로 바꾸어야 하는 부가적인 작업이 발생된다. 즉 입력, 수정,삭제시 기능성 컬럼에 대해 추가적인 고려를 해야한다.
8.5.2 진행 이력의 경우 시작과 종료에 대한 기능성 터럼이 존재하지 않아 성능저하
진행이력의 경우는 발생이력 또는 변경 이력과 다르게 발생된 시점 이외에도 데이터 조회가 빈번하게 이루어진다 그림 8-20에 잇는 기관정보 테이블은 어떤 시점에 따라 해당기관의 기관거래등급을 가지고 있으면서 다른 테이블에서 기관거래등급 정보를 참조하여 업무를 처리한다. 2004년 7월 1일자에 해당하는 기관코드와 기관거래등급을 조회하는 SQL구문은 다음과 같이 작성된다.
그림 8-20의 기관정보 테이블에서 2004년 7월 1일에 기관코드에 따른 기관거래등급 데이터를 가져오라면 'SELECT 기관코드, MAX(적용일자) ~ GROUP BY 기관코드'의 형식으로 먼저 지정된 날짜보다 같거다 작은 적용일자를 가져와야 한다. 그리고 다시 메인 쿼리에서 적용일자를 비교해야 데이터를 가져올수 있다, 실행계획을 보면 인라인뷰를 사용했으므로 VIEW라는 단어가 있고, SORT(GROUP BY)가 있어 데이터를 가져오기 위해 중간단계에서 정렬작업이 발생했음을 알 수 있다. 적용일자에 인덱스가 있어도 범위가 넓어 성능저하가 예상된다.
그래서 기관정보 테이블에 기간을 알 수 있도록 적용종료일자를 나타낸느 기능성 컬럼을 포함시켜 SQL구문을 작성해보았다.
새로운 데이터가 입력될때 적용종료일자 컬럼에는 업무적으로 입력되는 데이터가 있을수 없지만, 편의상 최대값(예를 들어, 9999년 1월 1일)을 입력하여 인덱스를 이용하는데 문제가 없도록 해야 한다.