SELECT A.CH_TYPE_NM , A.ITEM_CD , IO_DATE = dbo.DTRIM(A.IO_DATE, '-') , CH_DATE , B.ITEM_NM , B.ITEM_SPEC , B.UNIT FROM ( SELECT DIV_CD , CH_TYPE , CH_TYPE_NM = '등록' , ITEM_CD , IO_DATE , CH_DATE FROM ( SELECT TOP 1 * FROM BZ990T_HIST WHERE (@iIO_NO = '' OR IO_NO = @iIO_NO) AND (@iIO_SEQ IS NULL OR IO_SEQ = @iIO_SEQ) AND (@iDIV_CD = '' OR DIV_CD = @iDIV_CD) AND ((@iIO_DATE_FROM = '' OR IO_DATE >= @iIO_DATE_FROM) AND (@iIO_DATE_TO = '' OR IO_DATE <= @iIO_DATE_TO)) ORDER BY CH_DATE ASC ) AS A WHERE CH_TYPE = 'A' UNION ALL SELECT DIV_CD , CH_TYPE , CH_TYPE_NM = '수정' , ITEM_CD , IO_DATE , CH_DATE FROM ( SELECT * FROM BZ990T_HIST A WHERE (@iIO_NO = '' OR IO_NO = @iIO_NO) AND (@iIO_SEQ IS NULL OR IO_SEQ = @iIO_SEQ) AND (@iDIV_CD = '' OR DIV_CD = @iDIV_CD) AND ((@iIO_DATE_FROM = '' OR IO_DATE >= @iIO_DATE_FROM) AND (@iIO_DATE_TO = '' OR IO_DATE <= @iIO_DATE_TO)) AND CH_SEQ <> (SELECT TOP 1 CH_SEQ FROM BZ990T_HIST B WHERE B.IO_NO = A.IO_NO AND B.IO_SEQ = A.IO_SEQ AND B.CH_TYPE = 'A' ORDER BY B.CH_DATE ASC) ) AS A WHERE CH_TYPE = 'A' UNION ALL SELECT DIV_CD , CH_TYPE , CH_TYPE_NM = '삭제' , ITEM_CD , IO_DATE , CH_DATE FROM ( SELECT TOP 1 * FROM BZ990T_HIST WHERE (@iIO_NO = '' OR IO_NO = @iIO_NO) AND (@iIO_SEQ IS NULL OR IO_SEQ = @iIO_SEQ) AND (@iDIV_CD = '' OR DIV_CD = @iDIV_CD) AND ((@iIO_DATE_FROM = '' OR IO_DATE >= @iIO_DATE_FROM) AND (@iIO_DATE_TO = '' OR IO_DATE <= @iIO_DATE_TO)) ORDER BY CH_DATE DESC ) AS A WHERE CH_TYPE = 'D' ) AS A JOIN BC200T B ON A.ITEM_CD = B.ITEM_CD ORDER BY A.CH_DATE
안녕하세요. SQL을 사용하여 개발을 시작한지 1년이 안된 개발자입니다.
해당 프로시저의 목적은 히스토리를 조회하는 단순한 역할입니다. 특정 행의 데이터가 등록/수정/삭제 되었는지 판단 해야하는데 수정하는 프로세스가 단순 수정이 아니라 '삭제->등록'과 같이 이루어지다 보니 히스토리 상에서 해당 내용을 판단하려다 보니 이렇게 내용이 길어지게 되었네요....
현재 히스토리에 약 40만 건의 데이터가 있고 조회 조건을 통해서 한 번에 약 10 - 20개 정도의 데이터를 조회하게 됩니다. 시간이 약 5-10초 정도 소요되어서 시간을 줄일 수 있는 방법이 없을까 하고 질문하게 되었습니다.
조언 부탁드립니다. 감사합니다.
SELECT div_cd , ch_type , CASE WHEN ch_type = 'D' THEN '삭제' WHEN ch_type = 'A' AND rn = 1 THEN '등록' WHEN ch_type = 'A' AND rn > 1 THEN '수정' END ch_type_nm , item_cd , io_date , ch_date FROM (SELECT div_cd , ch_type , item_cd , io_date , ch_date , ROW_NUMBER() OVER(PARTITION BY div_cd, io_no, io_seq, ch_type ORDER BY ch_date) rn FROM bz990t_hist WHERE io_no = @iio_no AND io_seq = @iio_seq AND div_cd = @idiv_cd AND io_date >= @iio_date_from AND io_date <= @iio_date_to AND ch_type IN ('A', 'D') ) a ;