안녕하세요
이번에 시스템 업그레이드를 계획중에 데이터베이스 호환 테스트를 진행하고 있는데 역시나 문제가 좀 있네요
sql2000을 쓰고있는데 여기서 2012 버전으로는 호환이 불가능해서 sql2000 standard 에서 백업한 파일을 sql2008 express에서
복원한 뒤 다시 백업해서 sql2012 express에 복원했습니다
그랬더니 sql2000에 비해 속도는 개선이 되더군요 (메모리 추가하고 SAS->SSD로 교체한 영향도 있겠지만..)
세부적으로 테스트를 진행중인데 특정 쿼리에서 조회속도가 현저히 떨어지는 경우가 있네요
쿼리는 아래와 같습니다
SELECT AA.sMemberNo, CMSDateCount
From (
SELECT sCode, sMemberNo, CMSDateCount
FROM (
SELECT sCode, sMemberNo, sMProductCode, sSerialNo, sEndDate,
CONVERT(int, CONVERT(datetime, sEndDate) - getdate())
CMSDateCount
FROM TBL_CMS_Payment
WHERE sIsUse = 'Y' AND CONVERT(datetime, sEndDate)
>= DateAdd(Month, - 3, getdate()) AND CONVERT(datetime,
sEndDate) < DateAdd(Month, 3, getdate())
) A
INNER JOIN <-- ①
(
SELECT MemberNum, ProductNum, SerialNumber
FROM TBG_ClientProduct
WHERE IsUse = 'Y'
) B ON A.sMemberNo = B.MemberNum AND A.sMProductCode = B.ProductNum AND A.sSerialNo = B.SerialNumber
) AA
INNER JOIN
(
SELECT MA.sCode
FROM (
SELECT sCode, MAX(iUno) iUno
FROM TBL_CMS_Account
GROUP BY sCode
) MA
INNER JOIN
(
SELECT sCode, iUno
FROM TBL_CMS_Account
WHERE sClass = '1'
) MB ON MA.iUno = MB.iUno
GROUP BY MA.sCode
) BB ON AA.sCode = BB.sCode
Comment 4
-
맨즈밤
2013.09.24 11:04
-
로지남푠
2013.09.24 13:23
답변 감사합니다
관련 지식이 많이 부족한 관계로 문제점에 대한 충분한 정보 제공이 잘 안되네요^^;;
말씀하신 내용을 참고해서 다시 테스트 해볼께요~
-
건우아빠
2013.09.24 12:27
맨즈맘님 말씀에 추가로...
BB 부분을 굳이 max를 구한다음 다시 조인 해서 그룹을 잡을 필요가 있을지....
그냥
SELECT distinct sCode
FROM TBL_CMS_Account
WHERE sClass = '1' 만 하셔도 되지 않나요....
*= --> left outer join , left join
=* --> right outer join , right join 으로 하시면 됩니다...
-
로지남푠
2013.09.24 13:33
사실 본문의 쿼리를 제가 짠게 아니라 약 10년전 시스템 개발 업체에서 만들어 놓은건데 이번에 업그레이드 작업을 진행하면서 여기저기서 발생한 오류를 확인하는 중이라 쿼리의 용도를 일일이 다 파악하지 못하고 있답니다
그래서 단순하게 sql2000에서는 빠른 조회가 되던게 2012에서는 왜 느려지는가에 대한 답부터 찾고 있네요
말씀하신 내용도 참고해서 세밀하게 분석을 해봐야겠습니다
그리고 추가질문 내용은 현재 만들어져 있는 시스템에 쓰이는 주요 쿼리들은 DLL 파일로 컴파일되어 컴포넌트로 돌아가는 중인데 거기에 t-sql 조인문이 쓰인것으로 파악되네요
그렇다보니 해당 쿼리 수정이 불가능해서 2012에서 사용할수 있는 방법을 문의드린겁니다^^;;
좀 더 찾아보니 sql2008 버전까지는 sql2000모드 호환 설정이 가능하네요..
sql2012 버전에서 t-sql 조인문 사용 방법이 없으면 sql2008 버전을 사용하는것도 고려해야겠습니다..
답변 감사드립니다^^
인덱스를 만드셨다고 했는데, 거의 쓰이질 못했군요. 그리고 불필요하게 인라인뷰를 많이 쓰신거같습니다.
우선 인덱스 재작업,다시만들기,통계업데이트등을 작업하고 다시 조회해보시길 바랍니다. 이런 정보가 정확하지 못하면
멀쩡한 쿼리도 실행계획이 이상하게 만들어집니다.
불충분한 정보로 너무 세세하게 말씀을 못드릴거같구요. 몇가지 조언만 드리자면
WHERE SISUSE = 'Y'
AND CONVERT(DATETIME, SENDDATE) >= DATEADD(MONTH, - 3, GETDATE())
AND CONVERT(DATETIME, SENDDATE) < DATEADD(MONTH, 3, GETDATE())
요런식으로 WHERE 절에서 검색컬럼을 가공하지 말아주시구요.
인라인뷰를 풀어서 한쿼리로 하시기 바랍니다. (특히 하단에 MA.SCODE 로 그룹짓는 부분) 인라인뷰가 효과가 있을때는
미리 집합의 크기를 줄여서 다음 조인시 일량을 줄이기 위해서입니다.
그리고 2000과 2012를 비교하자면 정말 많은 튜닝 도구가 생겼습니다. 포괄열이라든지 필터인덱스등등
그러한것들을 적용시키면 만족할만한 결과가 있으리라 봅니다.