parallel 튜닝 문의 9 770

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절을 이용해서 처리 했습니다.

도움주셔서 감사합니다.