개발 TMS 서버에서는 1~2초 걸리는 쿼리가 운영 DB에서는 6초이상 소요됨
단편적으로는 개발서버 데이터가 운영서버 데이터보다 적기 때문,
근본적인 해결 방법으로는 현재 JOIN 대상 테이블들을 FULL SCAN하고 있기 때문에
JOIN 대상 컬럼에 대한 INDEX 생성 필요
SELECT A.*
FROM(
SELECT D.THEATRE_ID, D.AUDITORIUM_ID
,CASE WHEN (D.SPL_TITLE NOT LIKE '[%]%') THEN (SELECT E.SPL_TITLE FROM SMS_SPL_DTL E WHERE E.CONTENT_TITLE = D.SPL_TITLE AND E.SPL_TITLE LIKE '[%]%' AND E.AUDITORIUM_ID = 'AU003' ORDER BY E.SPL_TITLE LIMIT 1 )ELSE D.SPL_TITLE END AS SPL_TITLE
,CASE WHEN (B.SMS_CPL_ENCRYPTED_VIDEO = 'true') AND (B.SMS_CPL_IS_PLAYABLE = 'true') THEN 'ACTIVE'
WHEN (B.SMS_CPL_ENCRYPTED_VIDEO = 'true') AND (B.SMS_CPL_IS_PLAYABLE = 'false') THEN 'INACTIVE'
WHEN (B.SMS_CPL_ENCRYPTED_VIDEO = 'false') AND (B.SMS_CPL_IS_PLAYABLE = 'true') THEN 'NOT_ENCRYPTED' ELSE '' END AS KEY_STATUS
,B.SMS_CPL_ID, B.SMS_CPL_ENCRYPTED_VIDEO, B.NOT_VALID_AFTER
,B.SMS_CPL_DIMENSION
, SMS_CPL_RUNNUNG_TIME
FROM SMS_CPL B
LEFT JOIN (SELECT * FROM SMS_SPL_DTL) D
ON D.CONTENT_ID = B.SMS_CPL_ID AND D.AUDITORIUM_ID = B.AUDITORIUM_ID
WHERE B.AUDITORIUM_ID = 'AU003'
AND (B.SMS_CPL_RUNNUNG_TIME/1000) >= 2400
) A
WHERE A.SPL_TITLE IS NOT NULL;
JOIN되고 있는 SMS_CPL / SMS_SPL_DTL 모두 FULL SCAN을 하고 있다.
따라서 AUDITORIUM_ID 를 leading 컬럼으로 하여 인덱스 생성 필요
CREATE INDEX SMS_CPL_X1 ON SMS_CPL ( AUDITORIUM_ID , SMS_CPL_ID );
SMS_SPL_DTL 테이블은 JOIN 이되는 ON 조건에서 AUDITORIUM_ID와 CONTENT_ID 컬럼을 사용하고 있다.
CREATE INDEX SMS_SPL_DTL_X1 ON SMS_SPL_DTL ( AUDITORIUM_ID , CONTENT_ID );
또한 SMS_SPL_DTL CASE문 sub query에서 AUDITORIUM 와 CONTENT_TITLE 컬럼을 사용하고 있다.
CREATE INDEX SMS_SPL_DTL_X2 ON SMS_SPL_DTL ( AUDITORIUM_ID , CONTENT_TITLE );