parallel 튜닝 문의 0 9 2,020

by michael [2013.12.27 16:10:19]



a 테이블 : 100만건
b 테이블 : 1억 건

추출조건 : a테이블을 모두 스캔한 후  b테이블의 회원이 1이상인 것만
예상결과건수 : 5건 이하.

제가 작성한 쿼리
select id
  from
(select /*+ ordered full(t1) full(t2) use_nl(t2) parallel(t2 4) */
    id,
    row_number() over(partition by id order by 컬럼명) rn
  from a t1, b t2
    where t1.key = t2.key)
where rn > 1;
(use_nl를 작성한 이유 : 최종건수가 몇건 안되서)

시간이 너무 오래걸려 문의 드립니다.
by 마농 [2013.12.27 16:24:42]

full(t2) 과 use_nl(t2) 을 함께 주시면? 후덜덜...
100만번 루프돌면서 1억건을 풀스캔한다는 거죠?
이건 1억건 풀스캔을 100만번 수행하라는 말이죠.
use_nl 을 사용하려면 인덱스를 이용해야죠.


id 는 a 의 컬럼인가요? b 의 컬럼인가요?
id 와 key 는 다른 항목인가요?
100만건의 key 는 1억건에 모두 있는건가요?


by michael [2013.12.27 16:36:03]
id 는 a 의 컬럼인가요? b 의 컬럼인가요? id는 b의 컬럼입니다.

id 와 key 는 다른 항목인가요? 서로 다른 항목입니다.

100만건의 key 는 1억건에 모두 있는건가요? 모두 존재합니다.

by 마농 [2013.12.27 16:41:09]
-- 그렇다면 굳이 a 를 읽을 필요가 없는것 아닌지요?
SELECT id
  FROM b
 GROUP BY id
HAVING COUNT(*) > 1
;

by michael [2013.12.27 16:46:39]

b테이블만 읽어 having count(*) > 1하면 필요하지 않은 id가 발생하며 건수또한 많습니다.

a테이블을 읽어서 b테이블과 조인을 한 후 id가 1개 이상인 것 만 가져와야 합니다.
1건 이상인 것은 5건 이하입니다.

parallel(t2 4) use_hash(t2)로도 해봤는데 오래걸리네요.




by 마농 [2013.12.27 17:30:43]
-- 대용량이나 병렬처리는 다뤄보질 않아서 잘 모르겟네요.
-- 일단 성능은 보장 못하겠지만.. 다른 방식의 쿼리 올려봅니다.
-- 1. 기본적인 조인, b(key, id) 인덱스 필요
SELECT b.id
  FROM a, b
 WHERE a.key = b.key
 GROUP BY b.id
HAVING COUNT(*) > 1
;
-- 2. 셀프 조인, b(key, id), b(id) 인덱스 필요
SELECT b.id
  FROM a, b, b c
 WHERE a.key = b.key
   AND b.id = c.id
   AND b.ROWID != c.ROWID
;

by michael [2013.12.27 17:32:03]
정말 감사드립니다. ^^

by 임상준 [2013.12.27 17:33:17]

백만건 기준 조인이면 굳이 패러럴이 필요할만큼 많은 데이터는 아닌 것 같습니다~~


by 마농 [2013.12.27 17:47:45]
음. 채택되었네요? 해결되신건가요?
결과 공유 부탁드려요.

by michael [2013.12.27 18:44:15]
임상준님 말씀처럼 백만건 기준 조인의 경우 굳이 parallel이 필요가 없었습니다.

그래서 힌트를 제거하고 having절을 이용해서 처리 했습니다.

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