예를 들어
1) select * from aaa where date BETWEEN '20120613' AND '20130613' 일때랑
2) select * from aaa where date BETWEEN '20130613' AND '20130613' 일때랑 쿼리 실행속도가 현저히 차이가 나는데
문제는 1번쿼리(기간 1년)가 1번쿼리(기간 1달) 더 빠르다는겁니다.
흠..저번에 질문드렸던적이 있엇는데..통계관련된건지 알다가도 모르겠네요.
두 플랜도 아주 상이하게 나오구요
두경우의 플랜파일을 추가합니다.(파일안에 나누어져 있습니다.)
Comment 1
-
맨즈밤
2013.06.14 11:32
저도 궁금해서 답변이 언제달리나 기다렸는데,,, 안달리길래 달아봅니다. 정확하다기보다는 제 추정입니다. 밑에 고수분께서 답변 달아주실거에요..
XML로 된 실행계획은 첨봤는데,,,, 개인적으로 보기가 매우 어렵군요.
여튼..단순히보면 병렬처리(1년)냐 아니냐(1달) 차이인데요. 병렬처리 임계값을 넘겼으니 그러하리라 봅니다.
실행전에 관련 테이블들 인덱스 재작성이나 재정렬을 해보세요. 조각화가 많이 나거나 통계가 오래되면 실행계획이 제대로 안나올수있으니까요.
원래 쿼리가
SELECT COUNT(*) CNT2 ,b.syscd
FROM (SELECT syscd
FROM allmenuerp
WHERE syscd + tcode IN (SELECT DISTINCT b3.syscd + b3.pageName AS pageName
FROM SummaryByMenu b2 WITH (NOLOCK) ,PageNameList b3 WITH (NOLOCK)
WHERE b2.syscd = b3.SYSCD
AND b2.pagenameId = b3.id
AND b2.syscd IN ( SELECT syscd
FROM ITSM_SYS_CAT
WHERE corp = 'HKMC'
AND aptype = 'erp'
AND chgflag = 'V' )
AND b2.yyyymmdd BETWEEN '20120613' AND '20130613' ) )
GROUP BY b.syscd
이거지요? 맨 안쪽 서브쿼리의 ITSM_SYS_CAT 가 반복호출된게 아닌가 의심이....
구냥 제 나름대로 쿼리 바꿔봤습니다.
SELECT COUNT(*) CNT2 ,B.SYSCD
FROM (SELECT SYSCD
FROM ALLMENUERP T1
WHERE EXISTS (SELECT 'A'
FROM (SELECT SYSCD ,PAGENAMEID
FROM SUMMARYBYMENU WITH (NOLOCK)
WHERE SYSCD IN ( SELECT SYSCD
FROM ITSM_SYS_CAT WITH (NOLOCK)
WHERE CORP = 'HKMC'
AND APTYPE = 'ERP'
AND CHGFLAG = 'V' )
AND YYYYMMDD BETWEEN '20120613' AND '20130613') B2
INNER JOIN PAGENAMELIST B3 WITH (NOLOCK)
ON B2.SYSCD = B3.SYSCD AND B2.PAGENAMEID = B3.ID
WHERE T1.SYSCD=B3.SYSCD
AND T1.TCODE=B3.PAGENAMEID )
GROUP BY B.SYSCD
OPTION(FORCE ORDER)
또는
SELECT DISTINCT B3.SYSCD , B3.PAGENAME AS PAGENAME
INTO #TEMP
FROM (SELECT SYSCD ,PAGENAMEID
FROM SUMMARYBYMENU WITH (NOLOCK)
WHERE SYSCD IN ( SELECT SYSCD
FROM ITSM_SYS_CAT WITH (NOLOCK)
WHERE CORP = 'HKMC'
AND APTYPE = 'ERP'
AND CHGFLAG = 'V' )
AND YYYYMMDD BETWEEN '20120613' AND '20130613') B2
INNER JOIN PAGENAMELIST B3 WITH (NOLOCK)
ON B2.SYSCD = B3.SYSCD AND B2.PAGENAMEID = B3.ID
CREATE INDEX IDX_TEMP ON #TEMP (SYSCD,PAGENAME)
SELECT COUNT(*) CNT2 ,B.SYSCD
FROM (SELECT SYSCD
FROM ALLMENUERP T1
WHERE EXISTS (SELECT 'A'
FROM #TEMP B3
WHERE T1.SYSCD=B3.SYSCD
AND T1.TCODE=B3.PAGENAMEID )
GROUP BY B.SYSCD
OPTION(FORCE ORDER)
구냥 손가는데로 타이핑한것이니 구문오류 있으면 고쳐주세요~~~~