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 39191 게시물 읽기
No. 39191
검색 속도 관련 조언을 구합니다.
작성자
정연우(jung78yw)
작성일
2011-12-27 11:19ⓒ
2011-12-27 11:23ⓜ
조회수
5,521

        SELECT 

                 BD_MNG_NO, nvl(trim(DBT_CUS_NO),'0000000000000') DBT_CUS_NO,

                 nvl(trim(ACT_NO),'00000000000000') ACT_NO, BRC_CD, BSO_CD, ATH_CLS_CD,

                 CLT_EMP_ID, DBC_CUS_CLS, BD_CLS, BD_SRT, nvl(BD_AUT,'1'), nvl(MON_CNT,'1'),

                 BOND_RANK, trim(ENV_RANK), ACT_ITM, OLD_BOND_RANK,   
                 SUM(BF_MON_BAL), SUM(BD_AMT)   , SUM(UWD_PRL), SUM(PRL), SUM(BD_BAL),
                 sum(UWD_PRL)  as bank_amt,     
                nvl(sum(case when bd_cls ='1' and lgr_gn_dt <= '201111'||'25'   then UWD_PRL 
                                      when bd_cls ='2'         then UWD_PRL                                                      

                                       else 0 end),0) as brc_amt,
                 nvl(sum(case when bd_cls ='1' and lgr_gn_dt <= '201111'||'25'  then UWD_PRL 
                                      when bd_cls ='2'  then UWD_PRL                                                      

                                       else 0   end),0) as emp_amt  
        FROM (                                                                       
            SELECT  /*+ index (b BMIXP_BONDGET07) */ B.BD_MNG_NO, B.DBT_CUS_NO, B.ACT_NO,
                    B.BRC_CD, B.BSO_CD, B.ATH_CLS_CD, nvl(B.CLT_EMP_ID,'002229') CLT_EMP_ID,

                     B.DBC_CUS_CLS, B.BD_CLS, B.BD_SRT, B.BD_AUT,                    
                     CASE WHEN  (BD_CLS = '1' and BD_SRT = '1') and MON_CNT > 12     THEN   13 
                          WHEN  (BD_CLS = '2' AND BD_SRT IN ('1','2')) and mon_cnt > 36     THEN  37  

                          ELSE  NVL(MON_CNT,'1')          END   MON_CNT 
                   , nvl(BOND_RANK,'99') as bond_rank, nvl(trim(b.ENV_RANK),'Z') as ENV_RANK,

                     '0' ACT_ITM, nvl(B.BF_MON_BAL,0) BF_MON_BAL,   
                    nvl(B.BD_AMT,0) BD_AMT   , nvl(B.UWD_PRL,0) UWD_PRL, nvl(B.PRL,0) PRL,

                       nvl(B.BD_BAL,0) BD_BAL, LGR_GN_DT,                   

             NVL(OLD_BOND_RANK,NVL(BOND_RANK,'99')) OLD_BOND_RANK 
            FROM    TEST_TABLE b                                                                                     

            WHERE   BD_LGR_ST = '002'                                                                                                         
            AND     LGR_GN_DT <= '20111104'
            AND     BD_CLS IN ('1','2') AND BD_SRT IN ('1','2')                                                                               
            AND     ATH_CLS_CD IS NOT NULL  
            AND     ATH_CLS_CD IN ('00001','00002','00003','00004','00005', '10001', '10002', '10003', '10004', '10005', '20001', '30001', '90001')
           )                                                                                                                                  
        GROUP BY BD_MNG_NO, DBT_CUS_NO, ACT_NO,
                 ATH_CLS_CD,BRC_CD, BSO_CD, CLT_EMP_ID, DBC_CUS_CLS, BD_CLS, BD_SRT, BD_AUT, MON_CNT, BOND_RANK, trim(ENV_RANK), ACT_ITM,OLD_BOND_RANK      
;

---------------------------------------------------------------------------------------------------------------------------

-- TEST_TABLE은 약 1000만건의 데이터가 있고          BD_LGR_ST = '002'    조건으로 100만건으로 압축이 됩니다.

    현재 쿼리의 조회건수는 70만건 정도 이며 INDEX는   BMIXP_BONDGET07=>   ATH_CLS_CD + BD_LGR_ST + BD_CLS + BD_SRT  로 잡혀있습니다.
 

    조회 속도가 거의 20분 정도 걸리는데요.. 5분아래로 다운시키고 싶은데.. 이것 저것 해봐도 안되네요.. 혹시 방법있으시면 고수님들의 조언 부탁드립니다

Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=125 Card=1 Bytes=202)
   1    0   PARTITION LIST (ALL)
   2    1     SORT (GROUP BY) (Cost=125 Card=1 Bytes=202)
   3    2       INLIST ITERATOR
   4    3         TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'TEST_TABLE' (Cost=122 Card=1 Bytes=202)
   5    4           INDEX (RANGE SCAN) OF 'BMIXP_BONDGET07' (NON-UNIQUE) (Cost=121 Card=1)

 

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

1. 1000만건에 70만건이면 통상 index scan보다는 full scan이 유리합니다.

as-is : SELECT  /*+ index (b BMIXP_BONDGET07) */ B.BD_MNG_NO, B.DBT_CUS_NO,

to-be : SELECT  /*+ full(b) */ B.BD_MNG_NO, B.DBT_CUS_NO,

 

2. 더 빠르고 싶다면 병렬처리

to-be : SELECT  /*+ full(b) parallel(b 2) */ B.BD_MNG_NO, B.DBT_CUS_NO,

to-be : SELECT  /*+ full(b) parallel(b 4) */ B.BD_MNG_NO, B.DBT_CUS_NO, ....

 

3. 파티션에 대한 정보가 없어 모르겠으나

   파티션키에 해당하는 조건을 줄 수 있는지 고려.

 

 

dol님이 2011-12-29 17:20에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39194쿼리질문합니다. [1]
이혜미
2011-12-27
4067
39193대량 샘플 데이터 생성하기? [2]
김홍찬
2011-12-27
13157
39192오라클 버전에 따른 group by 오류에 도움 부탁드립니다. [2]
강옥석
2011-12-27
10256
39191검색 속도 관련 조언을 구합니다. [1]
정연우
2011-12-27
5521
39190netstat -an TIME_WAIT 와 성능과의 관계
알라딘
2011-12-27
4712
39188오라클 TO lock을 아시나요? [2]
김나래
2011-12-26
4678
39187No rows returned. [2]
궁금
2011-12-26
4282
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다