쿼리 속도와 효율에 관해서 질문이 있습니다. 0 3 2,460

by 동안이 [2015.12.11 16:55:00]


캡처.JPG (105,094Bytes)

잘 안풀려서 도움을 요청하고자 합니다.

 

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)

 

 

by swlee710 [2015.12.11 16:59:58]

실행계획이랑 인덱스 정보도 주세요


by 동안이 [2015.12.11 17:09:54]

실행 계획은

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)

입니다.

 

 

 


by 마농 [2015.12.12 16:19:46]

인라인뷰 B 를 만들어 A 와 조인한 것과 마찬가지로...
스칼라서브쿼리 2개를 인라인뷰 C 와 D 로 만들어 A 와 조인하는 형태로 바꿔보세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입