database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38780 게시물 읽기
No. 38780
SQL튜닝 부탁드립니다.
작성자
jinkuidong(jinkuidongjp)
작성일
2011-08-15 23:29
조회수
5,916

다음 쿼리의 성능을 높일수 있는 방법 부탁드립니다.

데이블 데이타 정보

 SCSA 최대 100만건

 SCRK 최대 500만건

 V_SS 최대 1만건

 

INSERT INTO SCGT ( 

    keyId, 

    no, 

    gno, 

    bata, 

    batb, 

    batc, 

    batago, 

    batbgo, 

    batcgo, 

    ssNo

   )

   SELECT 

         keyId, 

         no, 

         gno, 

         bata, 

         batb, 

         batc, 

         batago, 

         batbgo, 

         batcgo, 

         ssNo

    FROM

    (

     WITH V_SS as 

     (

        SELECT ms.*

         FROM 

             (

              SELECT /*+ INDEX_DESC (scn PK_SCSA) */

                     scn.*,

                     ROW_NUMBER() OVER (PARTITION BY scn.keyId ORDER BY scn.no DESC) rn 

                FROM SCSA scn 

               WHERE EXISTS

                    (

                     SELECT /*+ INDEX (sre AK_SCRK13) */

                            sre.keyId 

                       FROM SCRK sre 

                      WHERE sre.keyId = scn.keyId 

                        AND sre.ttkk = '1' 

                        AND sre.kgkb = '1' 

                        AND sre.stat = '660' 

                    )

              ) ms

         WHERE ms.rn = 1

     )

     (

     SELECT /*+ INDEX (sre PK_SCRK) */

           scn.keyId, 

           scn.no, 

           scn.gno, 

           scn.bata, 

           scn.batb, 

           scn.batc, 

           CASE scn.tztksf 

           WHEN '1' THEN

               CASE WHEN sre.tenkbn <> '4' THEN 

                   SUBSTR(NVL(scn3.bata, '00'), 1, 2) || 

                   SUBSTR(scn.bata, 3, 8) || 

                   '1' ||

                   SUBSTR(scn.bata, 12, 1)

               ELSE

                   CASE WHEN SUBSTR(scn.bata, 1, 2) IN ('61', '62','63') THEN

                       '41' || SUBSTR(scn.bata, 3, 4) || '000000'

                   ELSE

                       '42' || SUBSTR(scn.bata, 3, 4) || '000000'

                   END

               END

           WHEN '2' THEN

               CASE WHEN sre.tenkbn <> '4' THEN 

                   scn.bata

               ELSE

                   CASE WHEN SUBSTR(scn.bata, 1, 2) IN ('61', '62','63') THEN

                       '41' || SUBSTR(scn.bata, 3, 4) || '000000'

                   ELSE

                       '42' || SUBSTR(scn.bata, 3, 4) || '000000'

                   END

               END

           ELSE

               scn.bata

           END batago, 

           scn.batbgo, 

           CASE scn.tztksf 

           WHEN '1' THEN

               CASE WHEN sre.tenkbn <> '4' THEN 

                   NVL(scn3.batc, '000000')

               ELSE

                   NVL(scn2.batc, '000000')

               END

           WHEN '2' THEN

               CASE WHEN sre.tenkbn <> '4' THEN 

                   scn.batc

               ELSE

                   CASE WHEN SUBSTR(scn.bata, 1, 2) IN ('61', '62','63') THEN

                       '      '

                   ELSE

                       CASE WHEN scn.stkkk = '07' THEN 

                           '000008'

                       ELSE

                           '000001'

                       END

                   END

               END

           ELSE

               scn.batc

           END batcgo, 

           CASE WHEN scn.tztksf IN ('1', '2') THEN

               CASE WHEN sre.tenkbn <> '4' THEN

                   '2'

               ELSE

                   '3'

               END

           ELSE

               scn.ssNo

           END ssNo

      FROM SCRK sre, 

           V_SS scn, 

           V_SS scn2, 

           V_SS scn3 

     WHERE trim(sre.keyId) = scn.keyId 

       AND sre.ttkk = '1' 

       AND sre.kgkb = '1' 

       AND sre.stat =  '660' 

       AND NOT EXISTS

          (

           SELECT /*+ INDEX (sre2 AK_SCRK06) */

                  sre2.keyId 

             FROM SCRK sre2 

            WHERE sre2.gno = sre.gno 

              AND sre2.stat NOT IN ('660') 

          )

       AND scn.selecttkeyId = scn2.keyId(+) 

       AND scn2.tztksf(+) <> '0' 

       AND scn2.tztksf(+) <> '9' 

       AND scn.keyId = scn3.selecttkeyId(+) 

       AND scn.tztksf = scn3.tztksf(+) 

       AND scn3.keyId(+) <> scn3.selecttkeyId(+) 

       AND scn3.tztksf(+) <> '0' 

       AND scn3.tztksf(+) <> '9' 

     )

     UNION ALL

     (

     SELECT 

        scn.keyId, 

        scn.no, 

        scn.gno, 

        scn.bata, 

        scn.batb, 

        scn.batc, 

        scn.batago, 

        scn.batbgo, 

        scn.batcgo, 

        scn.ssNo

     FROM SCSA scn, 

        (SELECT /*+ INDEX (sre AK_SCRK13) */

                sei.keyId as keyId, 

                MAX(sei.no) AS max_no 

           FROM SCSA sei, 

                SCRK sre 

          WHERE sre.kgkb IN ('2','7','8','9') 

            AND sre.ttkk = '1' 

            AND trim(sre.keyId) = sei.keyId 

            AND NOT EXISTS

                (

                SELECT /*+ INDEX (sre2 AK_SCRK06) */

                       sre2.keyId 

                  FROM SCRK sre2 

                 WHERE sre2.gno = sre.gno 

                   AND sre2.stat NOT IN ('670') 

                )

            AND sre.stat IN ('670') 

          GROUP BY sei.keyId ) M 

      WHERE scn.keyId = m.keyId 

        AND scn.no  = m.max_no 

     )

    )

;

 

이 글에 대한 댓글이 총 2건 있습니다.

not in 과 trim 의 사용을 최대한 줄이셔야 할거같네요..

V_SS 를 3번이나 조인으로 걸었는데 index 를 잘 탄다면 몰라도 다른방법을 사용하는걸 찾으셔야 할거같고..

not exists 절 내의 not in 사용 부분이 아마도 코스트를 제일 많이 먹을거같은데..

실행계획과 인덱스 현황도 같이 올려주셔야  좀더 자세한 답변이 가능할거같습니다만..

 

1님이 2011-08-16 10:02에 작성한 댓글입니다. Edit

- cpu 성능과 OLTP/OLAP 성능에 따라서 pq 를 조절하세요.

 

INSERT INTO SCGT ( 

    keyId, 

    no, 

    gno, 

    bata, 

    batb, 

    batc, 

    batago, 

    batbgo, 

    batcgo, 

    ssNo

   )

   SELECT 

         keyId, 

         no, 

         gno, 

         bata, 

         batb, 

         batc, 

         batago, 

         batbgo, 

         batcgo, 

         ssNo

    FROM

    (

     WITH /*+ inline */ V_SS as 

     (

        SELECT ms.*

         FROM 

             (

              SELECT /*+ use_hash(scn sre) full(scn) parallel(scn 4) full(sre) parallel(sre 4) */

                     scn.*,

                     ROW_NUMBER() OVER (PARTITION BY scn.keyId ORDER BY scn.no DESC) rn 

                FROM SCSA scn 

               WHERE sre.keyId = scn.keyId                 

                AND sre.ttkk = '1' 

                AND sre.kgkb = '1' 

                AND sre.stat = '660' 

            ) ms

        WHERE ms.rn = 1

     )

     (

     SELECT /*+ leading(sre scn scn2 scn3 sre2) use_hash(sre scn scn2 scn3 sre2) full(sre) parallel(sre 4) full(sre2) parallel(sre2 4) */

            * 

      FROM SCRK sre, 

           V_SS scn, 

           V_SS scn2, 

           V_SS scn3 ,

           SCRK sre2 

     WHERE trim(sre.keyId) = scn.keyId 

       AND sre.ttkk = '1' 

       AND sre.kgkb = '1' 

       AND sre.stat =  '660'        

       AND scn.selecttkeyId = scn2.keyId(+) 

       AND scn2.tztksf(+) <> '0' 

       AND scn2.tztksf(+) <> '9' 

       AND scn.keyId = scn3.selecttkeyId(+) 

       AND scn.tztksf = scn3.tztksf(+) 

       AND scn3.keyId(+) <> scn3.selecttkeyId(+) 

       AND scn3.tztksf(+) <> '0' 

       AND scn3.tztksf(+) <> '9'                         

       AND sre2.gno(+) = sre.gno 

       AND sre2.stat(+) NOT IN ('660') 

       AND sre2.keyId is null

     )

     UNION ALL

     (

     SELECT 

        scn.keyId, 

        scn.no, 

        scn.gno, 

        scn.bata, 

        scn.batb, 

        scn.batc, 

        scn.batago, 

        scn.batbgo, 

        scn.batcgo, 

        scn.ssNo

     FROM SCSA scn, 

        (SELECT /*+ leading(sei sre sre2) use_hash(sei sre sre2) full(sei) parallel(sei 4) full(sre) parallel(sre 4) full(sre2) parallel(sre2 4) */

                sei.keyId as keyId, 

                MAX(sei.no) AS max_no 

           FROM SCSA sei, 

                SCRK sre,

                SCRK sre2 

          WHERE sre.kgkb IN ('2','7','8','9') 

            AND sre.ttkk = '1' 

            AND trim(sre.keyId) = sei.keyId 

            and sre2.gno(+) = sre.gno 

            AND sre2.stat(+) <> '670' 

            and sre2.keyId is null            

            AND sre.stat = '670' 

          GROUP BY sei.keyId ) M 

      WHERE scn.keyId = m.keyId 

        AND scn.no  = m.max_no 

     )

    )

;


 

박광일(tohappy)님이 2011-08-16 11:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38783두개의 쿼리가 결과값이 다른데...같게 맞추고 싶은데~~ [5]
한상원
2011-08-16
3974
38782Hot백업복구시 redo로그파일이 없다면, 어디까지 복구가능한가? [1]
이태훈
2011-08-16
5822
38781imp 오류 [2]
초보
2011-08-16
6775
38780SQL튜닝 부탁드립니다. [2]
jinkuidong
2011-08-15
5916
38779안녕하세요. 중복쿼리 1ROW 만들기 질문드립니다. [3]
질문자
2011-08-12
5713
38778Active - Active DB 데이터 동기화 [4]
곤지
2011-08-12
6283
38777update 하는 조건... [2]
권기혁
2011-08-12
4330
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다