database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41085 게시물 읽기
No. 41085
멀티스레드 분산 select
작성자
민주가인
작성일
2016-02-25 10:08
조회수
7,896

안녕하세요.

 

대용량 데이터 이관관련하여 문의 드립니다.

수GB 대용량 데이터를 select 후 bulk insert하고 있습니다.

이슈는 bulk insert에 대한 속도였는데 의외로 insert속도에는 문제가 없더군요

select, fetch, fetchSize에 대한 문제에 도달하게 되었습니다.

 

한번 select를 하게되면 전체데이터를 가져오는줄 알았는데

fetchSize 크기만큼 가져와서 fetch처리한다는 정도로 파악되었습니다.

그러다보니 insert보다도 굉장히 시간이 소요됨을 알았습니다.

 

그래서 process분리후 각 프로세스별로

페이징처리 로직을 변경하여 테스트한 결과 두배정도 빨라지긴했는데(20GB->25분내)

1. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 0 and rn <= 5G

2. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 5G and rn <= 10G

3. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 10G and rn <= 15G

4. select * from (select rownum rn,칼럼명들.... from table_name ) where rn > 15G and rn <= 20G

이런식입니다.

로그를 찍어보니

1번 스레드 select완료후 fetch 진행이 한참된 이후에 2번째 select가 완료되어 진행이 됨을 알았습니다.

결국 4번째는 거의 10분 이후에 완료됩니다.

 

별로 process(java)로 조회를 하고 있는데 같은 테이블을 조회를 해서 그럴까요? 각각 select(toad tool) 2~3분 내 끝나는데

분리해서 4개를 동시에 실행을하면 1->4 순으로 끝나야 select를 진행하고 있다는 느낌이 듭니다.

병렬처리를 위해서 프로세스를 분리하고 있는데 select를 동시적으로 못한다면 의미가 없을것 같은데

 

작업상 문제인건지, DBMS상 특성인건지, 설정 변경이나 옵션으로 가능한건지 답변 좀 주세요.

이 글에 대한 댓글이 총 2건 있습니다.

rn 조건이 서브쿼리 바깥쪽에만 있죠.
이러면 서브쿼리 안쪽에서 전체 데이터를 읽어 ROWNUM 합니다.
서브쿼리 안쪽에서 1차로 우선 걸러줘야 합니다.


1. select * from (select rownum rn,칼럼명들.... from table_name where rownum <=  5G) where rn >  0  and rn <=  5G
2. select * from (select rownum rn,칼럼명들.... from table_name where rownum <= 10G) where rn >  5G and rn <= 10G
3. select * from (select rownum rn,칼럼명들.... from table_name where rownum <= 15G) where rn > 10G and rn <= 15G
4. select * from (select rownum rn,칼럼명들.... from table_name where rownum <= 20G) where rn > 15G and rn <= 20G


원래 방업이 20G 씩 4번 80G를 읽어와 20G만 처리했다면?
개선 방법은 5+10+15+20=50G를 읽어와 처리하겠네요. 30G의 비효율이 개선되었네요.
ROWNUM 방법 사용시 5G씩 4번 20G 만 처리하지는 못합니다.
30G의 비효율은 여전히 발생하네요.

마농(manon94)님이 2016-02-25 15:05에 작성한 댓글입니다.

답변감사합니다.

테스트환경( 총20GB , 65,457,640건 , CPU:2core X 16, mem:64GB)

변경전 : 26:13 , 변경후 : 24:58 (5%향상)

처리로직 :

java를 이용한 4개의 독립 process, 각process별 4개 thread를 구성되어 있으며, thread별 별도 DB connection하여 추출 후 insert하고 있습니다.

 

이슈사항:

독립 process이고 별도 connection인데도 select문이 병렬처리가 아닌 순차적처리를하고 있는듯합니다.

동일 테이블에 대한 동시 병렬 추출이 안되는걸까요?

민주가인님이 2016-02-26 10:39에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41088SQL SERVER 2012에서의 PIVOT을 ORACLE11g에서 어떻게 변환 하나요?? [4]
Redical
2016-02-25
9862
41087수정1차) SP 선언시 매개변수를 데이터셋으로 받아서 처리 가능여부? [2]
권순환
2016-02-25
8556
41086pl/sql 에서 dbms_output.put_line 의 성능 문제는 없을까요?
나그네
2016-02-25
7457
41085멀티스레드 분산 select [2]
민주가인
2016-02-25
7896
41084쿼리 질문좀 드릴게요. [8]
또하루
2016-02-24
7985
41083초보가 질문 하나 드립니다. [1]
초보
2016-02-21
7538
41082쿼리 도와 주세욤... ㅜㅜ [2]
덕선이.
2016-02-18
7795
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.054초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다