FILTER를 활용한 정렬부하를 줄이는 튜닝 방법인것 같은데욤 0 4 2,786

by 호야 [Oracle Tuning] [2011.04.27 23:40:35]


SELECT DISTINCT CODE
   BRAND_NM  
  FROM GOODS a    
, SALE_DSNT b  
 WHERE a.GOODS_CODE = b.GOODS_CODE
   AND a.DIV_CODE = '00'
   AND b.ROWID = (  SELECT a.ROWID
   FROM SALE_DSNT a
  WHERE a.GOODS_CODE = b.GOODS_CODE   
    AND ROWNUM = 1
   ) 

의견

GOODS 와 SALE_DSNT  테이블은 1:M 관계

M 테이블에 필요한 매칭 ROW는 각 GOODS_CODE 1개만 필요
왜냐하면 나중에 DISTINCT 로 UNIQUE 하게 만들기 때문이죠.
많은 ROW들을 SORT 하기 전에 정렬의 부담을 없애기 위해 ROWID를 활용하여 FILTER를 하는겁니다

가상을 그려 봅니당...

1. DRIVING 테이블이 GOODS  가 될것 같군용
2. DIV_CODE 인건이 100개정도가 됩니다(종류 겠죠)
3. 이제 SALE_DSNT 테이블에 팔렸는지 안 팔렸는지 확인을 위해
    조인을 걸어 봅니다... GOOD_CODE를 활용하여...
4. 장사가 너무 잘되어서 매칭되는 건수가 10만건이네요...
    근데 우리가 필요한 UNIQUE한 데이터는 90개 인데요...
    10만건 SORT를 없애기 위해 B의 테이블에 매칭 되는 ROWID로 필터를 하게 됩니다.
5. FILTER 를 할때 GOODS_CODE의 INDEX를 이용할 테구요.
6. SINGLE BLOCK ACEESS를 하게된 서브쿼리는 정렬된 순서대로 SCAN을 하게 됩니다
7. 해당 GOODS_CODE의 INDEX의 최상단에 있는 애들만 맨날 걸리겠네요.
8. 우리가 원하던 90건만 추출을 해 냈습니다.
9. 상품의 브랜드는 상품 코드의 그룹이라 볼수 있겠네요.
10. 해당 코드와 브랜드는 90건중 20건 정도가 나올수가 있겠네요.

제가 유추해본봐에 의하면, 결론은 대량의 SORT로 인한 부하를 없애기 위한
ROWID를 활용한 FILTER 적용입니다.
허접하지만 답변을 달아 보았습니다 수고하세요^ㅡ^
이것이 아니라면, 고수분들이 더욱 자세한 답변을 달아 주실꺼예용
by 호야 [2011.04.27 23:43:08]
그리고 동일한 INDEX ROW에 접근하여 FILTER함으로 CACHE 효과도 얻을 수 있겠네요

by 문자 [2011.04.28 01:16:24]
음..감사 합니다.. ^^
근대 궁금한것은 ROWID를 and 절로 안해도 ... 결과값은 같은건가요?
단시 속도를 위한 조건일뿐이란 말슴이시죠?
rowid 를 조건으로 주는건 첨봐서;;
사실 테이블도 무지 많이 걸긴하는대..
2개가 핵심인거 같아서...좀 정리해서 질문 드렷거든요..

by 마농 [2011.04.28 08:15:47]
rowid 에만 포커스를 맞추려고 하지 마세요.
전체적인 쿼리를 보고 이해하셔야 합니다.

a 와 b의 관계가 1:다 관계이지만 1:다 가 아닌 1:1 관계를 만들기 위해
다인자료중 한건하고만 조인을 하고 나머지는 버리기기 위해
위와 같이 상관관계서브쿼리를 사용하여 rownum=1 인자료 가져와 rowid를 이용해 같은 테이블을 조인한 것입니다.

by 호야 [2011.04.28 09:06:55]
네 결과는 동일합니다 하지만 FILTER로 걸러내지
못하는 만큼 UNIQUE SORT행위를 일으킬 겁니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입