--SET STATISTICS IO ON
--SET STATISTICS TIME ON
SELECT
PAGELIST.*,
DBO.GET_SUBJCLASSNM(PAGELIST.UPPERCLASS, '000') AS SUBJCLASSNM,
(CASE
WHEN (SELECT
COUNT(*)
FROM TZ_PROPOSE
WHERE SUBJ = PAGELIST.SUBJ
AND YEAR = PAGELIST.YEAR
AND SUBJSEQ = PAGELIST.SUBJSEQ
AND USERID = N'chojy314')
> 0 THEN 'Y'
ELSE 'N'
END) AS PROPYN,
(CASE
WHEN (SELECT
COUNT(*)
FROM TZ_INTERESTSUBJ
WHERE USERID = N'chojy314'
AND SUBJ = PAGELIST.SUBJ)
> 0 THEN 'Y'
ELSE 'N'
END) AS INTERESTSUBJ
FROM (SELECT
((TOTALPAGE + 1) - RNUM) AS TNUM,
FLOOR((RNUM - 1) / 10 + 1) AS PAGENO,
10 AS PAGESIZE,
ORG_QUERY.*
FROM (SELECT
ROW_NUMBER() OVER (ORDER BY A.INDATE DESC) AS RNUM,
COUNT(*) OVER () AS TOTALPAGE,
A.SUBJ,
A.SUBJNM,
A.UPPERCLASS,
A.TUTOR,
A.EDUPERIOD,
A.CONTURL,
A.ISNEW,
A.ISHIT,
A.ISRECOM,
A.ISMOBILEYN,
A.INDATE,
A.EDULIMIT,
A.EDUTIMES,
A.ISMEMBERSHIP,
B.YEAR,
B.SUBJSEQ
FROM TZ_SUBJ A
INNER JOIN TZ_SUBJSEQ B
ON A.SUBJ = B.SUBJ
WHERE 1 = 1
AND B.GRCODE = 'N000003'
AND B.YEAR = '0000'
AND A.ISONOFF = 'N'
AND A.ISUSE = 'Y'
AND A.ISVISIBLE = 'Y'
AND dbo.to_date(GETDATE(), 'yyyymmddHH24') BETWEEN B.EDUSTART AND B.EDUEND
ORDER BY A.INDATE DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY) ORG_QUERY) PAGELIST
WHERE 1 = 1
ORDER BY PAGELIST.RNUM
증상 : 이 쿼리를 실행하면 reads 는 13555 밖에 안되는데 4초이상 걸려버림. cpu도 4초이상.
해당 쿼리를 개발에서 실행하면 또 빠름.
원인 : 개발과 운영의 실행시간이 다른것은 잘 모르겠으나 근본적인 문제가 있음.
위에 dbo.to_date(GETDATE(), 'yyyymmddHH24') 부분이 1번만 실행될줄 알았는데 resultset 갯수만큼 실행됨.
해결책 : 문제 부분을 tsql 변수로 처리해서 쿼리 윗부분에 변수 값 세팅하고 대체하는 방법
결과 : 0.1초
'MSSQL > 성능' 카테고리의 다른 글
02. (성능) 스칼라 함수를 SELECT절이나 WHERE절에 썻을 경우 성능 저하 (0) | 2016.01.18 |
---|---|
01. (성능)인덱스를 이용 못하는 경우(자바 유니코드 문제) (0) | 2016.01.18 |
MSSQL 튜닝 / DB단 (0) | 2015.12.17 |
이전 로우를 찾는 방법(MSSQL 2012 이후) (0) | 2015.12.17 |
attach(연결)한 DB의 읽기전용 상태 해결 (0) | 2015.12.03 |