오라클 힌트 사용 좀 알려주세요~ 0 4 2,175

by 현씨 [2012.08.01 18:40:56]



SELECT STATEMENT Optimizer=CHOOSE
  SORT (ORDER BY)
    NESTED LOOPS
  NESTED LOOPS
    NESTED LOOPS
  TABLE ACCESS (FULL) OF AF_FORM
  TABLE ACCESS (BY ROWID) OF AF_FIXMST
    INDEX (RANGE SCAN) OF IDX_AF_FIXMST_1 (NON-UNIQUE)
    INDEX (UNIQUE SCAN) OF PK_AW_CHLIST (UNIQUE)
  TABLE ACCESS (BY ROWID) OF AW_CHWON
    INDEX (RANGE SCAN) OF IDX_AW_CHWON_PK234 (NON-UNIQUE)
 

----------------------------> 실행계획 입니다


오라클 힌트 사용법은 제가 전혀 몰라요 ㅜㅜ

order by 하려고 하는데 시간이 너무 오래걸려서요~ 부탁드려요~~

쿼리는

SELECT a.fix_act_date "취득일자", a.fix_gbn_code||'-'||a.fix_mng_code||'-'||LTRIM(TO_CHAR(a.fix_seq_no,'00000')) "관리번호",
    a.fix_name "품명", NVL(b.fix_design_no,'') "품번",  a.fix_act_amt "취득금액",
    d.chw_jeryobi "재료비", d.chw_drt_exp+d.chw_ind_exp "노무비", d.chw_chg_exp+d.chw_fix_exp "경비"
FROM account.af_fixmst a, account.af_form b, account.aw_chlist c, account.aw_chwon d
WHERE a.fix_gbn_code  = 'F'
  AND a.fix_gbn_code  = c.chl_gae
  AND a.fix_mst_ym = c.chl_yymm
  AND a.fix_mst_seq = c.chl_seqno
  AND c.chl_gae = d.chw_gae
  AND c.chl_yymm = d.chw_job_yymm
  AND c. chl_seqno = d.chw_seqno
  AND a.fix_act_date BETWEEN TO_DATE('20090101','yyyymmdd') AND TO_DATE('20120630','yyyymmdd')
  ORDER BY a.fix_act_date
 
요거에요~~

힌트 어떻게 해야 쿼리속도 빨리질까여??
by 오케클릭 [2012.08.01 19:58:23]

1. 일단 제 생각은 a.fix_act_date 필드에 인덱스를 만들고요~ (없으면 만들면 좋을듯 싶어요)
2. order by 는 지워버리고요
3. 힌트를 인덱스를 만들었던  fix_act_date로 줬으면 좋겠고요~  ( /*+ INDEX_ASC(table index) */ )
4. account.af_form b << 요넘이 풀스켄의 원인인듯 보이는데...where 조인절에 걸리지 않아서 좀 그렇네요~
  <업무를 안다면 먼가 걸려야 하는게 맞을것 같습니다.>
5. a.fix_act_date BETWEEN TO_DATE('20090101','yyyymmdd') AND TO_DATE('20120630','yyyymmdd')
문장도 좀 바꿨으면 좋겠어요

account.af_fixmst a 대신에
(select * from account.af_fixmst where fix_act_date >= to_date('20090101'||'000000','yyyymmddhh24miss')
 and fix_gbn_code = 'F') 로 바꿨으면 좋겠네요

제가 생각하는 쿼리를 종합하자면..

 
SELECT /*+ INDEX_ASC(만든인덱스명) */ 
 a.fix_act_date "취득일자", a.fix_gbn_code||'-'||a.fix_mng_code||'-'||LTRIM(TO_CHAR(a.fix_seq_no,'00000')) "관리번호",
 a.fix_name "품명", NVL(b.fix_design_no,'') "품번", a.fix_act_amt "취득금액",
 d.chw_jeryobi "재료비", d.chw_drt_exp+d.chw_ind_exp "노무비", d.chw_chg_exp+d.chw_fix_exp "경비"
FROM (
  select * from account.af_fixmst 
	   where fix_gbn_code = 'F'
			 and fix_act_date >= to_date('20090101'||'000000','yyyymmddhh24miss')
			 and fix_act_date <= to_date('20120630'||'235959','yyyymmddhh24miss')
  ) a
	 inner join account.aw_chlist c
	 on a.fix_gbn_code = c.chl_gae
  AND a.fix_mst_ym = c.chl_yymm
  AND a.fix_mst_seq = c.chl_seqno
	 inner join account.aw_chwon d
	 on c.chl_gae = d.chw_gae
  AND c.chl_yymm = d.chw_job_yymm
  AND c. chl_seqno = d.chw_seqno
	 left outer join
	 account.af_form b on 1=1


by 부쉬맨 [2012.08.01 20:12:41]
from 절에 해당 테이블이 정의되어있는데 사용하지않네요? 
account.af_form b 
빼보세요

account.af_form b  이놈이 잘가다가 full을 읽어서
그걸 nl 조인으로 하나씩 침투하고있네요.

아니면 쿼리자체를


SELECT a.fix_act_date "취득일자", a.fix_gbn_code||'-'||a.fix_mng_code||'-'||LTRIM(TO_CHAR(a.fix_seq_no,'00000')) "관리번호",
  a.fix_name "품명", NVL(b.fix_design_no,'') "품번", a.fix_act_amt "취득금액",
  d.chw_jeryobi "재료비", d.chw_drt_exp+d.chw_ind_exp "노무비", d.chw_chg_exp+d.chw_fix_exp "경비"
FROM 
(select fix_act_date "취득일자", fix_gbn_code||'-'||fix_mng_code||'-'||LTRIM(TO_CHAR(fix_seq_no,'00000')) "관리번호",
    fix_name "품명", fix_act_amt "취득금액"
  from account.af_fixmst 
  where fix_gbn_code = 'F' 
   AND fix_act_date BETWEEN TO_DATE('20090101','yyyymmdd') AND TO_DATE('20120630','yyyymmdd')
  ORDER BY fix_act_date
   ) a, account.aw_chlist c, account.aw_chwon d
WHERE a.fix_gbn_code = c.chl_gae
 AND a.fix_mst_ym = c.chl_yymm
 AND a.fix_mst_seq = c.chl_seqno
 AND c.chl_gae = d.chw_gae
 AND c.chl_yymm = d.chw_job_yymm
 AND c. chl_seqno = d.chw_seqno

by 현씨 [2012.08.02 08:56:06]

감사합니다 조인조건 ㅡㅜ 죄송~

그걸 제가 왜 못봤을까요~ 조인조건을 추가하니  잘 되영~

그나저나 저는 실행계획을 보고  어떤인덱스를 만들어야 된다는지

힌트를 써야 되는것을 전혀 모르는데

쉽게 알 수 있는 ㄴ방법이 머가 있을까요??

인터넷에서 정보 찾아보았는데 이해가 잘 가지가 않더라구요~ ㅜㅗㅡ

by 부쉬맨 [2012.08.02 09:00:13]
fix_gbn_code = 'F' 인덱스가 일단은 위에꺼는 존재해야될꺼같다는 그리고 실행계획을 기반으로 만드는게 아니라 만드신 sql기반으로 만드셔야지 실행계획이 제대로 나올수가있겟지요. 실행계획기반으로도 만들수있겠지만 위의 실행계획자체가 잘못된거같아서 좀어렵네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입