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 39610 게시물 읽기
No. 39610
프로시저 속도 문제..
작성자
햇살한조각
작성일
2012-08-30 10:50
조회수
4,552

안녕하세요..

 

 요구조건 변경으로 쿼리문을 수정했는데..

 

쿼리만 따로 떼서 실행하면 1분정도 걸리는 쿼리가 프로시저에 넣고 돌리면 응답이 없습니다..

 

변경 전 쿼리는 잘 돌구요..

 

도대체 뭐가 원인인지 모르겠습니다.. 도와주세요 ㅠㅠ


/***************************************************************************************************************

INSERT INTO 대상테이블

                  SELECT A.*

                       , B.CNO

                  FROM   CR.TCNE_TBDA_DLY_INFO@RSSANTA A

                       , TRSW_ERARATGPROD B

                  WHERE  A.CONO = B.CONO

--                  AND   (A.DLY_ORG_C, A.ACNO, A.BAS_DATE) IN (

--                                                                SELECT DLY_ORG_C, ACNO, MAX(BAS_DATE)

                  AND   (A.CONO, NVL(A.BSNO, 'Z'), A.DLY_ORG_C, A.ACNO, NVL(A.MNG_BR_C, 'Z'), NVL(A.ITEM_C, 'Z'), NVL(A.REG_RSN_C, 'Z'), NVL(A.LN_BAL, 0), NVL(A.DLY_AMT, 0), NVL(A.DLY_RCKN_DATE, '99991231'), NVL(A.DLY_RELS_DATE, '99991231'), A.BAS_DATE)

                                                            IN (

                                                                SELECT CONO, NVL(BSNO, 'Z'), DLY_ORG_C, ACNO, NVL(MNG_BR_C, 'Z'), NVL(ITEM_C, 'Z'), NVL(REG_RSN_C, 'Z'), NVL(LN_BAL, 0), NVL(DLY_AMT, 0), NVL(DLY_RCKN_DATE, '99991231'), NVL(DLY_RELS_DATE, '99991231'), MAX(BAS_DATE)

                                                                FROM   CR.TCNE_TBDA_DLY_INFO@RSSANTA

                                                                WHERE  BAS_DATE <= V_BAS_DATE

                                                                AND   ((DLY_AMT >= 100000 AND TR_FORM_C IN ('01', '02', '03', '99'))

                                                                        OR TR_FORM_C = '04')

                                                                AND   (V_BAS_DATE BETWEEN DLY_RCKN_DATE AND NVL(DLY_RELS_DATE, '99991231')

                                                                        OR TO_CHAR(ADD_MONTHS(V_BAS_DATE, -6), 'YYYYMMDD') BETWEEN DLY_RCKN_DATE AND NVL(DLY_RELS_DATE, '99991231'))

--                                                                GROUP BY DLY_ORG_C, ACNO

                                                                GROUP BY CONO, NVL(BSNO, 'Z'), DLY_ORG_C, ACNO, NVL(MNG_BR_C, 'Z'), NVL(ITEM_C, 'Z'), NVL(REG_RSN_C, 'Z'), NVL(LN_BAL, 0), NVL(DLY_AMT, 0), NVL(DLY_RCKN_DATE, '99991231'), NVL(DLY_RELS_DATE, '99991231')

                                                             )

                  AND    B.BAS_DATE = V_BAS_DATE

***************************************************************************************************************/

 

주석으로 막힌 부분은 변경 전이고, 붉은색 부분이 변경 후 입니다..

 

 

 

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

계속 이것저것 테스트 해보는 중인데...

위 쿼리문중 V_BAS_DATE 부분은 변수에 담겨져 있는 값인데...

V_BAS_DATE를 하드코딩해서 해봤더니 30초 안으로 끝나네요...

 

다시 변수로 바꿔놓고 하면 응답이 없어요.... ㅠㅠ

 

햇살한조각님이 2012-08-30 11:17에 작성한 댓글입니다. Edit

SELECT a.* --  이부분엔 컬럼명을 일일히 기술해 줘야 합니다.
     , b.cno
  FROM (
        SELECT a.*
             , ROW_NUMBER() OVER(
               PARTITION BY cono
                          , bsno
                          , dly_org_c
                          , acno
                          , mng_br_c
                          , item_c
                          , reg_rsn_c
                          , ln_bal
                          , dly_amt
                          , dly_rckn_date
                          , dly_rels_date
               ORDER BY bas_date DESC
             ) rn
          FROM
cr.tcne_tbda_dly_info@rssanta a
         WHERE bas_date <= v_bas_date
           -- 조건절의 OR 가 맘에 안들어 다른방식으로 변경하였으나
           -- 몇가지 가정하에 변경한것으로 실제는 다를수도 있으니 참고하세요
           AND tr_form_c IN ('01', '02', '03', '99', '04)
           AND dly_amt >= DECODE(tr_form_c, '04', 0, 100000)
           AND dly_rckn_date <= v_bas_date
           AND NVL(dly_rels_date, '9')
            >= TO_CHAR(ADD_MONTHS(
               TO_DATE(v_bas_date, 'yyyymmdd')
               , -6), 'yyyymmdd')
           -- 여기까지
        ) a
      , trsw_eraratgprod b
 WHERE a.cono = b.cono
   AND b.bas_date = v_bas_date
   AND a.rn = 1
;

마농(manon94)님이 2012-08-31 14:40에 작성한 댓글입니다.

  V_VAS_DATE 가 변수일 경우와, 상수(하드코딩) 일때 Plan 이 변경될 것이라 예상됩니다.
하드코딩일 경우의 Plan 으로  HINT 를 고정하여 처리 하면 좋겠네요.

 

tohappy(tohappy)님이 2012-09-10 15:56에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39614오라클 데이터를 SPOOL SELECT를 안쓰고 CSV로 빠르게 만들수 있나요 [1]
select
2012-08-31
5131
39613어떤 쿼리가 나은건지 봐 주세요~ [2]
마루아라
2012-08-31
4271
39612통계성 쿼리 2번째 질문 [3]
쿼리 초보
2012-08-30
4250
39610프로시저 속도 문제.. [3]
햇살한조각
2012-08-30
4552
39609sum() over () 질문드립니다. [1]
정성태
2012-08-29
4090
39608통계성 쿼리 질문 드립니다. [4]
쿼리 초보
2012-08-28
4588
39607정렬쿼리 질문 좀요 [2]
축구
2012-08-27
3597
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다