갑자기 느려집니다. 0 11 741

by 푸릉이 [Oracle Tuning] [2017.09.20 11:20:20]


index.jpg (108,531Bytes)
full.jpg (107,171Bytes)

쿼리는

select
   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관
 , a.JBBSCODE 부서
 , a.JBILJA 일자
  , a.LOAD_CAPA 로드량
from TTADSJBM a , PHATHBSM B, PHATHBSM C, PHATHBSM D
where 1 =1
and a.JBILJA between :sdate and :edate
and B.BSCODE = C.JSSWBSCODE
and C.BSCODE = D.JSSWBSCODE
and a.JBBSCODE = D.JMBSCODE
and B.ISSYYEOBU = '1'
and C.ISSYYEOBU = '1'
and D.ISSYYEOBU = '1'

이렇습니다. PHATHBSM 이건 부서정보가 담겨있는 테이블입니다.
BSCODE 부서코드이고 , JSSWBSCODE 상위부서코드 입니다.
현재 플랜은

SELECT STATEMENT  ALL_ROWSCost: 145  Bytes: 23,230  Cardinality: 202                              
    12 FILTER                          
        11 NESTED LOOPS                      
            9 NESTED LOOPS  Cost: 145  Bytes: 23,230  Cardinality: 202                  
                7 NESTED LOOPS  Cost: 25  Bytes: 9,700  Cardinality: 100              
                    4 NESTED LOOPS  Cost: 24  Bytes: 6,363  Cardinality: 101          
                        1 TABLE ACCESS FULL TABLE EAI.PHATHBSM Cost: 23  Bytes: 2,929  Cardinality: 101      
                        3 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1      
                            2 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32  
                    6 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1          
                        5 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32      
                8 INDEX RANGE SCAN INDEX (UNIQUE) TT.TTADSJBM_PK Cost: 1  Cardinality: 32              
            10 TABLE ACCESS BY INDEX ROWID TABLE TT.TTADSJBM_DAMO Cost: 1  Bytes: 36  Cardinality: 2          

입니다. 풀스캔을 타고있습니다.

하지만 , a.LOAD_CAPA 로드량 이부분을 주석처리하면

SELECT STATEMENT  ALL_ROWSCost: 145  Bytes: 23,230  Cardinality: 202                              
    12 FILTER                          
        11 NESTED LOOPS                      
            9 NESTED LOOPS  Cost: 145  Bytes: 23,230  Cardinality: 202                  
                7 NESTED LOOPS  Cost: 25  Bytes: 9,700  Cardinality: 100              
                    4 NESTED LOOPS  Cost: 24  Bytes: 6,363  Cardinality: 101          
                        1 TABLE ACCESS FULL TABLE EAI.PHATHBSM Cost: 23  Bytes: 2,929  Cardinality: 101      
                        3 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1      
                            2 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32  
                    6 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1          
                        5 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32      
                8 INDEX RANGE SCAN INDEX (UNIQUE) TT.TTADSJBM_PK Cost: 1  Cardinality: 32              
            10 TABLE ACCESS BY INDEX ROWID TABLE TT.TTADSJBM_DAMO Cost: 1  Bytes: 36  Cardinality: 2              

인덱스를 타서 1초만에 결과가 나옵니다. 풀스캔시에는 13초정도 걸립니다.

뽑아내는 컬럼이 있고없고에 따라 플랜이 다른건 첨보는듯해서요.

그리고  PHATHBSM B, PHATHBSM C, PHATHBSM D 기관명을 뽑아내기위해서 썼는데 더 나은방법이 있을까요?

 

 

by 우리집아찌 [2017.09.20 11:31:41]

PHATHBSM 테이블을 계층쿼리로 바꾸심이 어떨런지요?


by 푸릉이 [2017.09.20 11:44:31]

PHATHBSM 에 대해서 계층쿼리로 3번 걸어보라는 말인가요?


by 우리집아찌 [2017.09.20 13:05:15]

대충보긴 했는데

   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관

구하시는거보니 굳이 2번이나 조인할 필요는 없어보이는데요..

인라인뷰로 계층쿼리 만드시고 TTADSJBM 랑 조인걸어보심이.

 

 


by 푸릉이 [2017.09.20 13:18:38]

쿼리로 보여주시면 ㅠ


by 부쉬맨 [2017.09.20 12:48:28]

select /*+ leading(a d c b) */
   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관
 , a.JBBSCODE 부서
 , a.JBILJA 일자
  , a.LOAD_CAPA 로드량
from TTADSJBM a , PHATHBSM B, PHATHBSM C, PHATHBSM D
where 1 =1
and a.JBILJA between :sdate and :edate
and B.BSCODE = C.JSSWBSCODE
and C.BSCODE = D.JSSWBSCODE
and a.JBBSCODE = D.JMBSCODE
and B.ISSYYEOBU = '1'
and C.ISSYYEOBU = '1'
and D.ISSYYEOBU = '1'

 

or

 

a 랑 d를 use_nl(a d) 형태로 풀리도록

 


by 푸릉이 [2017.09.20 13:10:47]

2가지다 해봤는데 기존과 차이가 없이 30초 정도 걸리네요 ㅜ


by jkson [2017.09.20 12:51:48]

갑자기 테이블풀스캔하는 것은 TTADSJBM_IDX01 결합인덱스에 JBBSCODE, JBILJA 컬럼은 존재하지만 LOAD_CAPA 컬럼은 존재하지 않아 나타난 현상으로 보이네요. LOAD_CAPA 컬럼 데이터를 확인하려면 테이블로 가야하는데 인덱스->테이블로 가는 비용이 테이블풀스캔보다 크다고 판단하여 그냥 테이블풀스캔으로 실행계획이 바뀐 것으로 보입니다. TTADSJBM_IDX01에 LOAD_CAPA 컬럼을 추가하시든지, 출력되는 건수가 작다면 LOAD_CAPA  부분을 서브쿼리로 바꾸셔야할 것 같습니다.

select
   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관
 , a.JBBSCODE 부서
 , a.JBILJA 일자
  ,(select LOAD_CAPA from TTADSJBM e where e.rowid = a.rowid) 로드량
from TTADSJBM a , PHATHBSM B, PHATHBSM C, PHATHBSM D
where 1 =1
and a.JBILJA between :sdate and :edate
and B.BSCODE = C.JSSWBSCODE
and C.BSCODE = D.JSSWBSCODE
and a.JBBSCODE = D.JMBSCODE
and B.ISSYYEOBU = '1'
and C.ISSYYEOBU = '1'
and D.ISSYYEOBU = '1'

 


by 푸릉이 [2017.09.20 13:11:11]

컥 1초도 안돼서 결과가 나오네요.....ㄷ ㄷ
그럼 저기서는 로드량만 했는데 컬럼 한 7개정도를 추가해야하거든요 이럴경우는 어떻게 해야하나요?


by jkson [2017.09.20 13:19:01]
select
   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관
 , a.JBBSCODE 부서
 , a.JBILJA 일자
 , e.LOAD_CAPA
 , e.~~~
from TTADSJBM a , PHATHBSM B, PHATHBSM C, PHATHBSM D, TTADSJBM E
where 1 =1
and a.JBILJA between :sdate and :edate
and B.BSCODE = C.JSSWBSCODE
and C.BSCODE = D.JSSWBSCODE
and a.JBBSCODE = D.JMBSCODE
and B.ISSYYEOBU = '1'
and C.ISSYYEOBU = '1'
and D.ISSYYEOBU = '1'
and a.rowid = e.rowid

 


by 푸릉이 [2017.09.20 13:58:51]

select
   B.HGYCMYEONG 차상위기관
 , C.HGYCMYEONG 상위기관
 , D.HGYCMYEONG 기관
 , a.JBBSCODE 부서
 , a.JBILJA 일자
  , (select LOAD_CAPA from TTADSJBM e where e.rowid = a.rowid) 로드량
  , (select EMPTY_VEHICLE_WEIGHT from TTADSJBM e where e.rowid = a.rowid) 공차중량
from TTADSJBM a  left join TTADSCHH DD on
                 ( GBYUMU = '1'  and a.JBBSCODE = DD.JBBSCODE and a.JBNYEONWEOL = DD.JBNYEONWEOL  and a.JBIRBEONHO  = DD.JBIRBEONHO)  
, PHATHBSM B, PHATHBSM C, PHATHBSM D
where 1 =1
and a.JBILJA between :sdate and :edate
and B.BSCODE = C.JSSWBSCODE
and C.BSCODE = D.JSSWBSCODE
and a.JBBSCODE = D.JMBSCODE
and B.ISSYYEOBU = '1'
and C.ISSYYEOBU = '1'
and D.ISSYYEOBU = '1'

조인하나 더 시키니까 

 

Plan
SELECT STATEMENT  ALL_ROWSCost: 226  Bytes: 30,098  Cardinality: 202                              
    1 TABLE ACCESS BY USER ROWID TABLE TT.TTADSJBM_DAMO Cost: 1  Bytes: 19  Cardinality: 1                          
    2 TABLE ACCESS BY USER ROWID TABLE TT.TTADSJBM_DAMO Cost: 1  Bytes: 19  Cardinality: 1                          
    16 FILTER                          
        15 NESTED LOOPS OUTER  Cost: 226  Bytes: 30,098  Cardinality: 202                      
            12 NESTED LOOPS  Cost: 145  Bytes: 26,058  Cardinality: 202                  
                9 NESTED LOOPS  Cost: 25  Bytes: 9,700  Cardinality: 100              
                    6 NESTED LOOPS  Cost: 24  Bytes: 6,363  Cardinality: 101          
                        3 TABLE ACCESS FULL TABLE EAI.PHATHBSM Cost: 23  Bytes: 2,929  Cardinality: 101      
                        5 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1      
                            4 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32  
                    8 TABLE ACCESS BY INDEX ROWID TABLE EAI.PHATHBSM Cost: 1  Bytes: 34  Cardinality: 1          
                        7 INDEX RANGE SCAN INDEX EAI.PHATHBSM_IDX03 Cost: 1  Cardinality: 32      
                11 TABLE ACCESS BY INDEX ROWID TABLE TT.TTADSJBM_DAMO Cost: 1  Bytes: 64  Cardinality: 2              
                    10 INDEX RANGE SCAN INDEX (UNIQUE) TT.TTADSJBM_PK Cost: 1  Cardinality: 32          
            14 TABLE ACCESS BY INDEX ROWID TABLE TT.TTADSCHH Cost: 1  Bytes: 20  Cardinality: 1                  
                13 INDEX RANGE SCAN INDEX (UNIQUE) TT.TTADSCHH_PK Cost: 1  Cardinality: 1              
 

또 풀로 풀려버리네요 ...


by jkson [2017.09.20 19:54:10]

TTADSCHH 에서 사용할 컬럼이 하나라면 마찬가지로 서브쿼리로 하시면 됩니다.

여러개면 조인으로 바꾸셔야 되는데요. 부시맨님 처럼 LEADING 힌트로

기존 조인 순서를 유지시키시고 TTADSCHH테이블이 제일 마지막에 조인이 되게 유도하시면 됩니다.

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