뷰가 한 100여개를 생성했습니다. 근데 조건절에 들어가는 년도를 나중에 수정해야 할일이 생긴다고 하더군요
그래서 생각한 방안이 3가지입니다.
평가년도(기준년도입니다.) 반환하는 함수를 생성해 조건절에 삽입하는 겁니다. 그럼 함수 하나만 고치면 모든 뷰에 적용이 되겠죠
두번째는 테이블을 만들어서 서브쿼리 혹은 조인해서 조건절에 삽입하는 겁니다. 물론 프로시져를 하나 만들어서 해당 년도를 집어넣으면
원하는데로 정보가 바뀌게 해놨고. 한 로우만 삽입되어 있습니다.
세번재는 프로그램을 작성해서 스크립트를 자동 생성해서 새로 뷰들을 만드는 거죠 ㅡ.ㅡ;;
세개중에 가장 깔끔한게 첫번째 함수를 이용하는 것이어서 추진했는데
10분정도 걸리던 수행속도가 1시간이 넘어가도록 결과가 나타나지를 않는 겁니다. 수동정지하면 sql어드밴티지나 sql클래식이 죽어버리더군요.
그래서 인덱스 문제인가? 싶은데 제가 실력이부족해서 잘 모르겠더군요.
그래서 결국 두번째 방안으로 하니 제속도가 나오더군요.
아무래도 함수때문에 속도가 안 나오는 거 같은데 제가 알고 있는 지식안에서나 고참들에게 문의를 해도 그게 말이 되냐? 왜 안 되냐? 이유를
모르겠더라고요.
일단 함수는 아래와 같습니다.
drop function getBscYear;
create function getBscYear() returns char(4)
-- 평가년도 지정; 이함수만 고치면 모든 뷰에 적용이 됨; 년도를 변경하실땐 data_out변수에 하드코딩하시면 됩니다.
BEGIN
DECLARE data_out char(4);
SET data_out = substring(convert(varchar,dateadd(mm,-1,getdate()),112),0,4); --기본적으로 전달의 년도를 평가년도로 지정
--SET data_out = '2006'; -- 수동 지정할 시 이렇게 변경하시면 됩니다.
RETURN data_out;
END;
뷰는 아래와 같구요
DROP VIEW BSC_G02_M02_X04
GO
CREATE VIEW BSC_G02_M02_X04 AS
SELECT
SUBSTRING(B.APPVL_DATE,1,6) AS YM,
A.MNG_BO_CD AS DEPTCD,
max(C.DEPTNAME) AS DEPTNAME,
COUNT(A.RECP_NMBR) JUNCHE_CNT,
COUNT(CASE WHEN PROC_DDAY_DATE >= B.APPVL_DATE THEN A.RECP_NMBR END) GIHANAE_CNT,
GETDATE() AS INP_DATE
FROM DAM_통합민원서류 A,
DAM_통합결재완료 B,
KLWC_DW_DEPTCODE C
WHERE A.RECP_NMBR = B.RECP_NMBR
AND SUBSTRING(A.RECP_NMBR,0,4) = C.NO_CD
AND A.RECP_DATE >= getBscYear() || '0101' -->>접수일자
AND A.RECP_DATE <= getBscYear() || substring(convert(varchar,dateadd(dd,-1,getBscYear() ||substring(convert(varchar,getdate(),112),5,2)||'01' ),112),5,8) -->>접수일자
AND B.APPVL_STAT = '3' -->>결재구분
AND B.APPVL_DATE <= getBscYear() || substring(convert(varchar,dateadd(dd,-1,getBscYear() ||substring(convert(varchar,getdate(),112),5,2)||'01' ),112),5,8) -->>결재일자
AND ISNULL(A.SRC_DEL_YN,'') <> 'Y' -->>DELETE 구분
AND A.RECP_NMBR NOT LIKE '________[5-8]%' -->>접수번호(민원처리건만)
AND A.RECP_STAT IN ('3','4') -->>접수상태
AND A.CVAP_DOC_CD LIKE '[3,4,6,7]%' -->>민원서류(보상코드건만)
AND A.TABL_NM <> 'CAZ100MT' -->>일부기타건이 CAZ100MT로 들어감(제외)
AND A.DEL_YN <> 'Y'
AND B.APPVL_LDGR_SEQNO = 0 -->> 2007. 1. 5. Lee. H. S (최종결재회차)
GROUP BY A.MNG_BO_CD, SUBSTRING(B.APPVL_DATE,1,6)
도대체 이유가 뭘까요?
그리고 많은 뷰들의 조건절을 한번에 바꾸게 하는 방안이 있을까요? 반드시 뷰여야 합니다. 프로시져나 템프테이블을 이용하는건 안 됩니다.
고수님들의 많은 관심과 답변 부탁드리겠습니다.
|