WITH ORG_TREE AS
(
SELECT D.ORG_NAME ,
D.ORG_ID ,
D.UP_ORG_ID ,
CONVERT(VARCHAR(100), ORG_NAME) AS FULL_ORG ,
1 lvl
FROM ORGANIZATION D
WHERE D.ORDER_NO = 1
UNION ALL
SELECT E.ORG_NAME ,
E.ORG_ID ,
E.UP_ORG_ID ,
CONVERT(VARCHAR(100), OT.FULL_ORG + ' > ' + E.ORG_NAME) AS FULL_ORG ,
lvl + 1 lvl
FROM ORGANIZATION E
INNER JOIN ORG_TREE OT
ON E.UP_ORG_ID = OT.ORG_ID
)
WITH ORG_TREE_SEAR AS (
SELECT D.ORG_ID
FROM ORGANIZATION D
WHERE D.ORG_ID = #{orgId}
UNION ALL
SELECT E.ORG_ID
FROM ORGANIZATION E
INNER JOIN ORG_TREE_SEAR OT ON E.UP_ORG_ID = OT.ORG_ID
)
SELECT A.USER_ID
, B.USER_NAME
, C.ORG_NAME
, CONVERT(VARCHAR, A.CONNECT_DATE, 120) AS CONNECT_DATE
, A.USER_TYPE
, A.USER_IP
, A.SSO_ID
, G.FULL_ORG
FROM CONNECT_STAT A
LEFT OUTER JOIN USER B
ON A.USER_ID = B.USER_ID
LEFT OUTER JOIN ORGANIZATION C
ON B.ORG_ID = C.ORG_ID
LEFT OUTER JOIN ORG_TREE G
ON C.ORG_ID = G.ORG_ID
WHERE 1 = 1
AND (
A.CONNECT_DATE BETWEEN CONVERT(datetime, #{searchStDate} + ' 00:00:00', 120)
AND CONVERT(datetime, #{searchEnDate} + ' 23:59:59', 120)
)
ORDER BY CONNECT_DATE DESC
OFFSET 0 ROWS FETCH NEXT 91256 ROWS ONLY;
우선 쿼리는 이렇구요
로컬컴퓨터에서 실행했을 때는 실행속도가 얼마 안 걸렸습니다.
근데 운영 리눅스 서버에서 실행하니 실행속도가 3분이 넘어가더라구요
이 쿼리를 속도를 향상시킬 수 있는 방법이 있을까요?? ㅠ
사용자가 많다면 서브 쿼리를 이용하면 조금 개선이 될 거 같습니다.
서브 쿼리에서 인라인뷰가 아닌 스칼라 서브쿼리를 쓰면
중복이 많은 조직도 같은 경우 한번 탐색한 것은 메모리 이용하여 탐색 시간이 줄 거 같구
사용자 이름은 유일 값이라 스칼라 효과 없을 거 같구
조직도 관련 테이블이 많이 보이는데
재귀함수 써서 조직 테이블을 1번만 조회하면 좋을 거 같구
CONNECT_STAT 이 테이블은 히스토리 성격을 가지고 있는 거 같은데
운영에서 특성 타는 부분이 이 테이블이 운영 환경에서는 데이터가 많아 발생하지 않을까 합니다.
특히 해당 테이블 유일한 조건인 CONNECT_DATE 항목이 인덱스를 잘 타고 있는지 체크가 필요해보입니다