쿼리튜닝 초보입니다. 도움좀 부탁드려요 0 7 1,308

by 암행어사또 [SQL Query] 튜닝 [2015.06.23 11:03:59]


Explain plan.png (9,880Bytes)

SELECT a.memcd,
         b.memnm,
         b.sex,
         b.memiden,
         REPLACE (b.handtel, ' ', '') handtel,
         SUM (a.sale_amt) amt0
    FROM pntlog a INNER JOIN MEMBER b ON a.memcd = b.memcd
   WHERE     a.memdate BETWEEN '20120623' AND '20150623'
         AND b.handtel > '0'
         AND b.updgb = '0'
         AND b.memnm NOT LIKE '*%'
         AND a.jumcd = '01'
GROUP BY a.memcd,
         b.memnm,
         b.sex,
         b.memiden,
         b.handtel

 

이 쿼리 하나만 한다면 그냥 사용할텐데 동일한 쿼리를 여러번 union all 로 사용할 예정이라

튜닝이 필요할듯 싶습니다.

여기서 between, >, not like 이 조건이 풀테이블스캔하는 이유라고 생각됩니다.

어떤식으로 튜닝을 해야 할까요?

 

 

by DarkBee [2015.06.23 11:14:00]

기본으로 인덱스 정보 정도는 주셔야지요


by 암행어사또 [2015.06.23 11:17:12]

아 일자(memdate)랑 이름(memnm)에는 인덱스가 있습니다.

늦게 올려서 죄송합니다 ㅎㅎ


by 겸댕2후니 [2015.06.23 11:20:00]

각각 테이블에 memdate와 memnm이 단일인덱스로 존재하는건가요?


by DarkBee [2015.06.23 11:18:25]

memcd 에는 없나요?


by 암행어사또 [2015.06.23 11:22:39]

memcd는 pk입니다.

memdate, memnm, handtel 은 단일 인덱스로 존재합니다.

제가 설명을 너무 부족하게 써놓앗네요 ㅜㅠ


by DarkBee [2015.06.23 11:28:54]
ELECT /*+ ORDERED USE_NL ( a b ) INDEX ( a 인덱스명(memdate) ) */
         a.memcd,
         b.memnm,
         b.sex,
         b.memiden,
         REPLACE (b.handtel, ' ', '') handtel,
         SUM (a.sale_amt) amt0
    FROM pntlog a INNER JOIN MEMBER b ON a.memcd = b.memcd
   WHERE     a.memdate BETWEEN '20120623' AND '20150623'
         AND b.handtel > '0'
         AND b.updgb = '0'
         AND b.memnm NOT LIKE '*%'
         AND a.jumcd = '01'
GROUP BY a.memcd,
         b.memnm,
         b.sex,
         b.memiden,
         b.handtel

 


by 암행어사또 [2015.06.23 12:18:26]

감사합니다 ㅎㅎ 인덱스 잘타네요 ㅎ

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