안녕하세요~ 항상 사이트에서 많은 도움을 받고 있어, 고맙게 생각하고 있습니다.
현재 SQL WHERE절에서 성능을 위하여 왼쪽 조건 부분에 가능한 변형을 안하려고 하는데,
아래 쿼리가 가장 문제가 되고 있는 상황에서 조건 부분을 어떻게 변경을 하면,
인덱스를 타기나 성능상 좋을지 아시는 분이 계시면 조언 부탁 드리겠습니다.
기존에 워낙 성능 부분을 고려하지 않고, 프로그램만 되게 하면 된다는 생각에 지금에 와서야
많은 후회를 하고 있습니다. - -
<조건절>
where t2.ftrantype=21
and isnull(t3.finterid,0)<>0
and t2.fdate>='2012-11-01'
and
(CONVERT(varchar(12),DATEADD(DAY,0,getdate()),23
))<(CONVERT(varchar(12),DATEADD(DAY,5,t2.fdate),23 ))
--ts.fdate형식은 2012-11-01임.
And 'XC'+isnull(t2.fheadselfb0163,'')=t2.fbillno
--fheadselfb0163 WMS전표번호
and
substring(t2.fbillno,1,2)='XC'
그럼 남은 시간도 수고하시고요~
Comment 4
-
처리짱
2013.05.22 19:42
-
맨즈밤
2013.05.23 09:23
에...그냥 참고만 삼으시구요. 아마 더 좋은 답변은 밑에 달릴거에요.ㅎㅎ
WHERE 만 조건주셨으니 그것만 보자면...그리고 T2 T3 은 INNER 조인 걸려있다고 가정해보겠습니다.
WHERE T2.FTRANTYPE=21 -- =조건이니 패스
AND ISNULL(T3.FINTERID,0)<>0 -- 0이 아닌데이터의 분포도가 적고 , NULL값이 의미가 없다고 한다면 해당컬럼의 속성을
디폴트0 으로 해놓으시고, 인덱스 생성 (이왕이면 필터된 인덱스로 0이 아닌값만 저장)
AND T2.FDATE>='2012-11-01' -- 가공 안되었으니 패스
AND (CONVERT(VARCHAR(12),DATEADD(DAY,0,GETDATE()),23 ))<
(CONVERT(VARCHAR(12),DATEADD(DAY,5,T2.FDATE),23 ))
-- 가령 A+B = C+D 요식은 A=C+D-B 이거나 A-D=C-B 이런식으로 치환되듯이 요 구문도 치환시키면 가공안시켜도 될듯
-- 싶습니다. T2.FDATE 에 5일을 더해서 계산이 아닌 GETDATE()에 5을 빼서 계산하는 식으로요
AND 'XC'+ISNULL(T2.FHEADSELFB0163,'')=T2.FBILLNO -- 동일테이블의 컬럼끼리 비교이니 패스
AND SUBSTRING(T2.FBILLNO,1,2)='XC' -- T2.FBILLNO LIKE 'XC%' 로 변경
성능이 중요한 쿼리이고 자주 사용된다면 인덱스에 대한부분 , 인덱스 커버처리에 대한부분등에 대해서 면밀히 컴토해서
적용하시면좋은결과가 있으리라고 봅니다. 인덱스부분은 WHERE절만 봐서는 제가 함부로 말씀드리기가 어려울듯합니다.
-
kravitz
2013.05.23 10:01
최대한 Supressing 을 피해보는게 좋을 것 같아 이렇게 수정해봤습니다
where t2.ftrantype = 21
--and isnull(t3.finterid,0) <> 0
and ( t3.finterid <> 0 or t3.finterid is not null )
and t2.fdate >= '2012-11-01'
--and (CONVERT(varchar(12),DATEADD(DAY,0,getdate()),23 ))<(CONVERT(varchar(12),DATEADD(DAY,5,t2.fdate),23 ))
--ts.fdate형식은 2012-11-01임.
and t2.fdate > convert(varchar(10), dateadd(dd, -5, getdate()), 121)
--And 'XC'+isnull(t2.fheadselfb0163,'')=t2.fbillno --fheadselfb0163 WMS전표번호
and t2.fbillno = 'XC' + isnull(t2.fheadselfb0163,'')
--and substring(t2.fbillno,1,2) = 'XC'
and t2.fbillno like 'XC%'
-
김범수_279397
2013.05.30 15:30
너무 감사합니다. ^^
그리고 kravitz님 조언해 주신 쿼리로 해서 수정을 했는데, 속도가 50% 이상은 빨라진거 같습니다.
다시 한번 조회조건에서 어떻게 코딩을 하는냐에 따라 속도가 달라지는지 체감을 하였습니다.
fdate 요게 varchar 형인가요?