잘 안풀려서 도움을 요청하고자 합니다.
SELECT
A.P_ID
, (SELECT SUBSTR(XMLAGG (XMLELEMENT (C, ',', C.CA_NAME) ORDER BY CA_NAME).EXTRACT ('//text()'), 2)
AS CA_NAME
FROM TB_CATEGORY C, TB_PHOTOCATEGORY CP
WHERE C.CA_ID = CP.CA_ID
AND CP.P_ID = A.P_ID) AS CA_NAME -- 카테고리명 ex) 축구,농구
, (SELECT SUBSTR(XMLAGG (XMLELEMENT (B, ',', B.MAJOR_NAME) ORDER BY MAJOR_NAME).EXTRACT ('//text()'), 2) AS MAJOR_NAME -- 인물명
FROM TB_PHOTOPERSON B
WHERE B.P_ID = A.P_ID) AS MAJOR_NAME
, META_VALUE_LIST -- 메타명
FROM TB_PHOTO A, (
SELECT
P_ID,
SUBSTR (XMLAGG (XMLELEMENT (a, ',', META_VALUE) ORDER BY META_ID).EXTRACT ('//text()'), 2) AS META_VALUE_LIST
FROM (
SELECT
A.P_ID, A.META_ID, CODE_FLAG,
DECODE(CODE_FLAG,'0', META_VALUE, '1',
(SELECT METACODE_NM
FROM TB_STMETACODE STMC
WHERE STMC.META_ID = C.META_ID
AND STMC.METACODE_ID = META_VALUE)) AS META_VALUE
FROM (SELECT
A.P_ID, B.META_ID,
B.CODE_FLAG
FROM TB_PHOTO A, (
SELECT * FROM TB_STMETA WHERE USE_FLAG ='0' ) B
) A, TB_STMETAPHOTO C
WHERE A.P_ID = C.P_ID (+)
AND A.META_ID = C.META_ID (+)
)
GROUP BY P_ID
) B
WHERE 1 = 1
AND A.P_ID = B.P_ID(+)
메인 테이블은 TB_PHOTO 테이블 이고 엑셀 화면에 보여줄 쿼리를 만들고 있습니다.
각각 TB_STMETA(메타), TB_PHOTOPERSON(인물), TB_CATEGORY(카테고리)에서
한 사진(P_ID)당 여러 카테고리나 인물이 있을 수 있어서
인물과 카테고리는 한열의 한 행에 EX) 축구,농구 EX)무리뉴, 퍼거슨
이렇게 들어가게 해서 쿼리를 짰고,
메타는 사용중인 USE_FLAG = 0 인걸 기준으로 저게 3개라고 예를 들면
무조건 3개가 나오게 짰습니다. 값이 없으면 빈값 EX) 빈값,메시,호날두
그래서 쿼리를 돌렸더니 쿼리가 제가 생각하는 대로 맞게 잘 나왔는데
속도 문제에서 막히네요..
이렇게 쿼리를 짰는데 카테고리와 인물의 XMLAGG 를 빼고 쿼리를 돌려보니까.
건수가 30만 건이라도 5분 안에 되는데.
카테고리와 인물의 XMLAGG를 다시 넣어서 쿼리를 돌리니까 10만건 부터는 엄청 느려지네요.. 1분이 지나도 안되는.
어떻게 해야 더 빨라지게 할 수 있을까요?
한쿼리로 만들어서 해야 되는데.. 도움 좀 부탁드리겠습니다.
인덱스 정보는 *괄호안 숫자는 INDEX POS 입니다.
메인 테이블
TB_PHOTO : P_ID(1) , ORG_CD(1), WF_ID(1), P_TITLE(1), OPEN_DIV_CD(1)
, P_STATUS(1), REG_DT(1)
카테고리
TB_PHOTOCATEGORY : P_ID(1), CA_ID(2)
TB_CATEGORY : CA_ID(1), CA_NAME(1)
인물
TB_PHOTOPERSON : P_ID(1), MAJOR_ID(2)
메타
TB_STMETAPHOTO : P_ID(1), META_ID(2)
TB_STMETA : META_ID(1), USE_FLAG(1)
TB_STMETACODE : META_ID(1), METACODE_ID(2)
실행 계획은
P_ID(사진 ID), CA_NAME(카테고리), MAJOR_NAME(인물), META_VALUE_LIST(메타명)
을 보여줄려고 하고
35만건 정도를 돌렸을때 6분안에 나오게 할려고 합니다.
인덱스 정보는 *괄호안 숫자는 INDEX POS 입니다.
메인 테이블
TB_PHOTO : P_ID(1) , ORG_CD(1), WF_ID(1), P_TITLE(1), OPEN_DIV_CD(1)
, P_STATUS(1), REG_DT(1)
카테고리
TB_PHOTOCATEGORY : P_ID(1), CA_ID(2)
TB_CATEGORY : CA_ID(1), CA_NAME(1)
인물
TB_PHOTOPERSON : P_ID(1), MAJOR_ID(2)
메타
TB_STMETAPHOTO : P_ID(1), META_ID(2)
TB_STMETA : META_ID(1), USE_FLAG(1)
TB_STMETACODE : META_ID(1), METACODE_ID(2)
입니다.