쿼리는
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 기관명을 뽑아내기위해서 썼는데 더 나은방법이 있을까요?
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) 형태로 풀리도록
갑자기 테이블풀스캔하는 것은 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'
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
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
또 풀로 풀려버리네요 ...